Есть ли быстрый встроенный способ проверить, содержит ли 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;
}