У меня есть свойство в классе, который является ISet. Я пытаюсь получить результаты запроса linq в это свойство, но не могу понять, как это сделать.
В основном, ищем последнюю часть этого:
ISet<T> foo = new HashedSet<T>();
foo = (from x in bar.Items select x).SOMETHING;
Может также сделать это:
HashSet<T> foo = new HashSet<T>();
foo = (from x in bar.Items select x).SOMETHING;
HashedSet
. Это просто сбивает с толку,C#
иLINQ
ничего не называетсяHashedSet
.Ответы:
Я не думаю, что есть что-то встроенное, что делает это ... но действительно легко написать метод расширения:
Обратите внимание, что вам действительно нужен метод расширения (или, по крайней мере, универсальный метод некоторой формы) здесь, потому что вы не сможете явно выразить тип
T
:Вы не можете сделать это с явным вызовом
HashSet<T>
конструктора. Мы полагаемся на вывод типов для универсальных методов, чтобы сделать это для нас.Теперь вы можете назвать его
ToSet
и вернутьсяISet<T>
- но я бы придерживалсяToHashSet
и конкретного типа. Это согласуется со стандартными операторами LINQ (ToDictionary
,ToList
) и учитывает расширение в будущем (напримерToSortedSet
). Вы также можете предоставить перегрузку, определяющую сравнение для использования.источник
GetHashCode
иEquals
? Если нет, они не будут очень хороши в HashSet ...ForEach
, ноToHashSet
имеет гораздо больше смысла - я не знаю ни одной причины, чтобы не делать ничего,ToHashSet
кроме обычного «не соответствует плану полезности» (с которой я не согласен, но ...)