我有一个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;
我有一个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
的类型:
var query = from i in Enumerable.Range(0, 10)
select new { i, j = i + 1 };
var resultSet = query.ToHashSet();
通过显式调用HashSet<T>
构造函数是无法做到这一点的.我们依靠类型推理来实现泛型方法.
现在您could Select 将其命名为ToSet
,然后返回ISet<T>
-但我将坚持使用ToHashSet
和具体类型.这与标准LINQ运算符(ToDictionary
、ToList
)一致,并允许将来扩展(例如ToSortedSet
).您可能还希望提供指定要使用的比较的重载.