Oke, berikut adalah metode paling efisien yang dapat saya pikirkan menggunakan .Net standar
using System;
using System.Collections.Generic;
public static class Extension
{
public static bool HasDuplicate<T>(
this IEnumerable<T> source,
out T firstDuplicate)
{
if (source == null)
{
throw new ArgumentNullException(nameof(source));
}
var checkBuffer = new HashSet<T>();
foreach (var t in source)
{
if (checkBuffer.Add(t))
{
continue;
}
firstDuplicate = t;
return true;
}
firstDuplicate = default(T);
return false;
}
}
pada dasarnya, apa gunanya menghitung seluruh urutan dua kali jika yang ingin Anda lakukan hanyalah menemukan duplikat pertama.
Saya dapat mengoptimalkan ini lebih banyak dengan casing khusus, urutan elemen kosong dan tunggal, tetapi itu akan berkurang dari keterbacaan / pemeliharaan dengan keuntungan minimal.