咨询区
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,后来我想了下,可能程序员在这一块使用频次太低吧,不过现在加进来了,给它点个赞!