我在一个 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;
我不 认为 有任何内置的东西可以做到这一点......但编写扩展方法真的很容易:
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:
T
var query = from i in Enumerable.Range(0, 10) select new { i, j = i + 1 }; var resultSet = query.ToHashSet();
你不能通过显式调用HashSet<T>构造函数来做到这一点。我们依靠泛型方法的类型推断来为我们做这件事。
HashSet<T>
现在您 可以 选择命名ToSet并返回ISet<T>- 但我会坚持使用ToHashSet具体类型。这与标准 LINQ 运算符 ( ToDictionary, ToList) 一致,并允许将来扩展 (例如ToSortedSet)。您可能还希望提供指定要使用的比较的重载。
ToSet
ISet<T>
ToHashSet
ToDictionary
ToList
ToSortedSet