¿Cómo elimino duplicados de una matriz de C#?

Resuelto lomaxx asked hace 16 años • 29 respuestas

He estado trabajando con una string[]matriz en C# que se devuelve desde una llamada de función. Posiblemente podría enviar contenido a una Genericcolección, pero me preguntaba si había una mejor manera de hacerlo, posiblemente usando una matriz temporal.

¿Cuál es la mejor manera de eliminar duplicados de una matriz de C#?

lomaxx avatar Aug 13 '08 18:08 lomaxx
Aceptado

Posiblemente podrías usar una consulta LINQ para hacer esto:

int[] s = { 1, 2, 3, 3, 4};
int[] q = s.Distinct().ToArray();
Jeff Atwood avatar Aug 13 '2008 12:08 Jeff Atwood

Aquí está el enfoque HashSet<string> :

public static string[] RemoveDuplicates(string[] s)
{
    HashSet<string> set = new HashSet<string>(s);
    string[] result = new string[set.Count];
    set.CopyTo(result);
    return result;
}

Lamentablemente, esta solución también requiere .NET framework 3.5 o posterior, ya que HashSet no se agregó hasta esa versión. También puedes usar array.Distinct() , que es una característica de LINQ.

Arcturus avatar Aug 13 '2008 13:08 Arcturus

El siguiente código probado y funcional eliminará los duplicados de una matriz. Debe incluir el espacio de nombres System.Collections.

string[] sArray = {"a", "b", "b", "c", "c", "d", "e", "f", "f"};
var sList = new ArrayList();

for (int i = 0; i < sArray.Length; i++) {
    if (sList.Contains(sArray[i]) == false) {
        sList.Add(sArray[i]);
    }
}

var sNew = sList.ToArray();

for (int i = 0; i < sNew.Length; i++) {
    Console.Write(sNew[i]);
}

Podrías resumir esto en una función si quisieras.

GateKiller avatar Aug 13 '2008 13:08 GateKiller

Si necesita ordenarlo, puede implementar una clasificación que también elimine los duplicados.

Entonces mata dos pájaros de un tiro.

Matthew Schinckel avatar Aug 13 '2008 11:08 Matthew Schinckel

Esto podría depender de cuánto desee diseñar la solución: si la matriz nunca va a ser tan grande y no le importa ordenar la lista, es posible que desee probar algo similar a lo siguiente:

    public string[] RemoveDuplicates(string[] myList) {
        System.Collections.ArrayList newList = new System.Collections.ArrayList();

        foreach (string str in myList)
            if (!newList.Contains(str))
                newList.Add(str);
        return (string[])newList.ToArray(typeof(string));
    }
rjzii avatar Aug 13 '2008 13:08 rjzii