我有一个属于ISet的类的属性.我试图将linq查询的结果导入该属性,但无法弄清楚如何执行此操作.
基本上,寻找这个的最后部分:
ISet<T> foo = new HashedSet<T>();
foo = (from x in bar.Items select x).SOMETHING;
Run Code Online (Sandbox Code Playgroud)
也可以这样做:
HashSet<T> foo = new HashSet<T>();
foo = (from x in bar.Items select x).SOMETHING;
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 297
我认为没有内置的东西可以做到这一点......但是编写扩展方法真的很容易:
public static class Extensions
{
public static HashSet<T> ToHashSet<T>(
this IEnumerable<T> source,
IEqualityComparer<T> comparer = null)
{
return new HashSet<T>(source, comparer);
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,您确实需要扩展方法(或至少是某种形式的通用方法),因为您可能无法明确表达类型T:
var query = from i in Enumerable.Range(0, 10)
select new { i, j = i + 1 };
var resultSet = query.ToHashSet();
Run Code Online (Sandbox Code Playgroud)
你不能通过显式调用HashSet<T>构造函数来做到这一点.我们依靠通用方法的类型推断来为我们做这件事.
现在你可以选择命名ToSet并返回ISet<T>- 但我坚持使用ToHashSet具体类型.这与标准LINQ运算符(ToDictionary,ToList)一致,并允许将来扩展(例如ToSortedSet).您可能还希望提供指定要使用的比较的重载.
Joe*_*ler 73
只需将您的IEnumerable传递给HashSet的构造函数即可.
HashSet<T> foo = new HashSet<T>(from x in bar.Items select x);
Run Code Online (Sandbox Code Playgroud)
Dou*_*las 25
此功能已被添加作为扩展方法IEnumerable<TSource>来的.NET Framework 4.7.2:
ToHashSet<TSource>(IEnumerable<TSource>)ToHashSet<TSource>(IEnumerable<TSource>,?IEqualityComparer<TSource>)Mat*_*ott 17
正如@Joel所说,你可以直接传递你的枚举.如果你想做一个扩展方法,你可以这样做:
public static HashSet<T> ToHashSet<T>(this IEnumerable<T> items)
{
return new HashSet<T>(items);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
78984 次 |
| 最近记录: |