Si puede hacer la diferencia en su lugar, se puede hacer muy rápidamente y con cero asignaciones usando primero Array.Sort
y luego:
TSource oldV = source[0];
int pos = 1;
for (int i = 1; i < source.Count; i++)
{
var newV = source[i];
source[pos] = newV;
if (!eqComparer.Equals(newV, oldV))
{
pos++;
}
oldV = newV;
}
//pos now == the new size of the array
A continuación, tendrá que hacer un seguimiento del tamaño más pequeño ahora de el arreglo, o use Array.resize (Pero eso asignará un nuevo arreglo)
Alternativamente, si hace este mismo acercamiento con un List<T>
puede llamar al RemoveRange
al final para redimensionarlo sin asignarlo. Esto termina siendo significativamente más rápido.
Otros carteles son probablemente correctos, aunque puede lograr este objetivo de otra manera, como usar un hashset en primer lugar, o mantener colecciones paralelas donde una contiene solo los elementos distintivos todo el tiempo. Compensación de los pequeños costos en insertar/eliminar para que no se requiera ningún tiempo para obtener el conjunto distinto.
Ayudaría tener muchos más antecedentes ... – soandos
Necesita más detalles: ¿tiene control sobre cómo se genera la lista? Podría hacerlo mejor si nunca insertara elementos duplicados en la lista en primer lugar ... –
'.Distinct' _is_ faster. ¿Has perfilado? – SLaks