Я не думаю, что есть что-то встроенное, что делает это ... но действительно легко написать метод расширения:
public static class Extensions
{
public static HashSet<T> ToHashSet<T>(
this IEnumerable<T> source,
IEqualityComparer<T> comparer = null)
{
return new HashSet<T>(source, comparer);
}
}
Обратите внимание, что вам действительно нужен метод расширения (или, по крайней мере, универсальный метод некоторой формы) здесь, потому что вы не сможете явно выразить тип T
:
var query = from i in Enumerable.Range(0, 10)
select new { i, j = i + 1 };
var resultSet = query.ToHashSet();
Вы не можете сделать это с явным вызовом HashSet<T>
конструктора. Мы полагаемся на вывод типов для универсальных методов, чтобы сделать это для нас.
Теперь вы можете назвать его ToSet
и вернуться ISet<T>
- но я бы придерживался ToHashSet
и конкретного типа. Это согласуется со стандартными операторами LINQ ( ToDictionary
, ToList
) и учитывает расширение в будущем (например ToSortedSet
). Вы также можете предоставить перегрузку, определяющую сравнение для использования.
HashedSet
. Это просто сбивает с толку,C#
иLINQ
ничего не называетсяHashedSet
.