咨询区
Jamie:
我的类中有一个 ISet
类型的属性,我想将 linq 查询的结果赋给它,因为是 ISet 类型,所以我不知道是否有高效的方法将 linq 查询结果给之?
简单来说,就像下面这样:
ISet<T> foo = new HashedSet<T>();
foo = (from x in bar.Items select x).SOMETHING;
我在寻找 SOMETHING
这块该如何替代。
回答区
Jon Skeet:
我觉得 .NET 没有任何内部支持也没关键,大不了自己实现一个扩展方法就好,参考如下代码:
public static class Extensions
{public static HashSet<T> ToHashSet<T>(this IEnumerable<T> source,IEqualityComparer<T> comparer = null){return new HashSet<T>(source, comparer);}
}
有了扩展方法,接下来就可以这么用了。
var query = from i in Enumerable.Range(0, 10)select new { i, j = i + 1 };
var resultSet = query.ToHashSet();
除了用扩展方法,其实你也可以用 HashSet<T>
构造函数,比如下面这样。
var query = from i in Enumerable.Range(0, 10)select new { i, j = i + 1 };
var resultSet = new HashSet<int>(query);
Douglas:
你所说的 ToHashSet
扩展方法在 .NET Framework 4.7.2 和 .NET Core 2.0 中已经支持了。
public static HashSet<TSource> ToHashSet<TSource>(this IEnumerable<TSource> source)
{return source.ToHashSet(null);
}public static HashSet<TSource> ToHashSet<TSource>(this IEnumerable<TSource> source, IEqualityComparer<TSource> comparer)
{if (source == null){ThrowHelper.ThrowArgumentNullException(ExceptionArgument.source);}return new HashSet<TSource>(source, comparer);
}
可以看到,内部也是用 构造函数
的方式进行转换的。
点评区
其实在很多年前,我就在考虑为什么有 ToList, ToDictionary
方法而没有 ToHashSet,ToQueue,ToStack
,后来我想了下,可能程序员在这一块使用频次太低吧,不过现在加进来了,给它点个赞!