public static class Extensions
{
public static HashSet<T> ToHashSet<T>(
this IEnumerable<T> source,
IEqualityComparer<T> comparer = null)
{
return new HashSet<T>(source, comparer);
}
}
public static System.Collections.Generic.HashSet<TSource> ToHashSet<TSource> (this System.Collections.Generic.IEnumerable<TSource> source);
字符串 看起来我还不能在.NET标准库中使用它(在写这篇文章的时候)。所以我使用这个扩展方法:
[Obsolete("In the .NET framework and in NET core this method is available, " +
"however can't use it in .NET standard yet. When it's added, please remove this method")]
public static HashSet<T> ToHashSet<T>(this IEnumerable<T> source, IEqualityComparer<T> comparer = null) => new HashSet<T>(source, comparer);
public static ISet<T> EnsureSet<T>(this IEnumerable<T> source)
{
ISet<T> result = source as ISet<T>;
if (result != null)
return result;
return new HashSet<T>(source);
}
9条答案
按热度按时间svdrlsy41#
编辑(2023):现在有一个
ToHashSet
扩展方法-参见下面的Douglas' answer。我不认为有任何内置的东西可以做到这一点.
字符串
请注意,您确实需要一个扩展方法(或者至少是某种形式的泛型方法),因为您可能无法显式地表达
T
的类型:型
你不能通过显式调用
HashSet<T>
构造函数来实现这一点,我们依赖于泛型方法的类型推断来完成这一任务。现在你可以选择将其命名为
ToSet
并返回ISet<T>
--但我坚持使用ToHashSet
和具体类型。这与标准LINQ操作符(ToDictionary
,ToList
)一致,并允许将来扩展(例如ToSortedSet
)。你可能还想提供一个指定要使用的比较的重载。gorkyyrv2#
只需将您的IE传入HashSet的构造函数。
字符串
xytpbqjk3#
此功能已作为
IEnumerable<TSource>
上的扩展方法添加到.NET Framework 4.7.2和.NET Core 2.0。因此,它也可用于.NET 5和更高版本。ToHashSet<TSource>(IEnumerable<TSource>)
的ToHashSet<TSource>(IEnumerable<TSource>, IEqualityComparer<TSource>)
kx7yvsdv4#
正如@Joel所说,你可以只传入你的可扩展对象。如果你想做一个扩展方法,你可以这样做:
字符串
ltqd579y5#
在.NET框架和.NET核心中构建了一个扩展方法,用于将
IEnumerable
转换为HashSet
:https://learn.microsoft.com/en-us/dotnet/api/?term=ToHashSet字符串
看起来我还不能在.NET标准库中使用它(在写这篇文章的时候)。所以我使用这个扩展方法:
型
s2j5cfk06#
这很简单:)
字符串
是的,T是OP指定的类型:)
q9rjltbz7#
如果您只需要对集合进行只读访问,并且源代码是方法的参数,那么我会选择
字符串
原因是,用户可能已经用
ISet
调用了你的方法,所以你不需要创建副本。erhoui1w8#
Jon的回答是完美的。唯一的警告是,使用NHibernate的HashedSet,我需要将结果转换为集合。有没有最佳的方法来做到这一点?
字符串
或
型
还是我错过了什么?
编辑:这是我最终做的:
型
vs3odd8k9#
与简单地将IELTS转换为HashSet不同,将另一个对象的属性转换为HashSet通常很方便。您可以将其写为:
字符串
但是,我更喜欢使用选择器:
型
他们做同样的事情,第二个显然更短,但我发现这个成语更适合我的大脑(我认为它就像ToDictionary)。
下面是要使用的扩展方法,支持自定义比较器作为奖励。
型