C#:良好和有效的实现的IEnumerable的 .HasDuplicates
-
16-09-2019 - |
题
没有人有用于发现如果项的序列具有任何重复良好和有效的扩展方法?
我想我可以把return subjects.Distinct().Count() == subjects.Count()
成一个扩展方法,但那种认为应该有一个更好的办法。这种方法将不得不两次计算元素和理清所有DISTICT元素。更好的实现应该就可以找到的第一个副本返回true。任何好的建议吗?
我想象中的轮廓可能是这样的:
public static bool HasDuplicates<T>(this IEnumerable<T> subjects)
{
return subjects.HasDuplicates(EqualityComparer<T>.Default);
}
public static bool HasDuplicates<T>(this IEnumerable<T> subjects, IEqualityComparer<T> comparer)
{
...
}
但不太清楚如何智能实现,这将是...
解决方案
public static bool HasDuplicates<T>(this IEnumerable<T> subjects)
{
return HasDuplicates(subjects, EqualityComparer<T>.Default);
}
public static bool HasDuplicates<T>(this IEnumerable<T> subjects, IEqualityComparer<T> comparer)
{
HashSet<T> set = new HashSet<T>(comparer);
foreach (T item in subjects)
{
if (!set.Add(item))
return true;
}
return false;
}
其他提示
这是在生产代码。工作很大:
public static bool HasDuplicates<T>(this IEnumerable<T> sequence) {
var set = new HashSet<T>();
return !sequence.All(item => set.Add(item));
}
我认为最简单的扩展方法如下。
public static bool HasDuplicates<T>(this IEnumerable<T> enumerable) {
var hs = new HashSet<T>();
foreach ( var cur in enumerable ) {
if ( !hs.Add(cur) ) {
return false;
}
}
}
不隶属于 StackOverflow