有没有一种快速的内置方法来检查一个是否IEnumerable<string>
只包含不同的字符串?
一开始我是这样开始的:
var enumAsArray = enum.ToArray();
if (enumAsArray.Length != enumAsArray.Distinct().Count())
throw ...
但是,这看起来像是 O(2n) - 是吗?ToArray()
可能是 O(1)?
这看起来更快:
var set = new HashSet<string>();
foreach (var str in enum)
{
if (!set.Add(str))
throw ...
}
这应该是 O(n),但是,是否也有内置的方法?
编辑:也许 Distinct() 在内部使用它?
解决方案: 在考虑了所有评论和答案后,我为我的第二个解决方案编写了一个扩展方法,因为这似乎是最快的版本,也是最易读的:
public static bool ContainsDuplicates<T>(this IEnumerable<T> e)
{
var set = new HashSet<T>();
// ReSharper disable LoopCanBeConvertedToQuery
foreach (var item in e)
// ReSharper restore LoopCanBeConvertedToQuery
{
if (!set.Add(item))
return true;
}
return false;
}