Voici la méthode la plus efficace à laquelle j'ai pensé en utilisant le standard .Net.
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;
}
}
En fait, quel est l'intérêt d'énumérer deux fois la séquence entière si tout ce que vous voulez faire est de trouver le premier doublon.
Je pourrais optimiser encore plus ce processus en mettant sous boîtier spécial les séquences vides et les séquences à un seul élément, mais cela réduirait la lisibilité et la facilité de maintenance pour un gain minimal.