243 votes

Comment supprimer les doublons d'un tableau C# ?

J'ai travaillé avec un string[] en C# qui est renvoyé par un appel de fonction. Je pourrais éventuellement faire un cast vers un Generic mais je me demandais s'il n'y avait pas un meilleur moyen de le faire, peut-être en utilisant un tableau temporaire.

Quelle est la meilleure façon de supprimer les doublons d'un tableau C# ?

5 votes

Utilisez la méthode de l'extension distincte.

1 votes

En effet. C'est plus amusant lorsque le tableau est déjà trié - dans ce cas, cela peut être fait in-place en temps O(n).

0 votes

@Vitim.us Non. Dans mon cas, ce n'est même pas un tableau, mais une List<string>. J'accepte toute réponse qui fait l'affaire. Peut-être, c'est un choc de devoir le faire sur papier.

490voto

Jeff Atwood Points 31111

Vous pourriez éventuellement utiliser une requête LINQ pour ce faire :

int[] s = { 1, 2, 3, 3, 4};
int[] q = s.Distinct().ToArray();

30 votes

Notez que vous pouvez utiliser un IEqualityComparer comme paramètre, tel que .Distinct(StringComparer.OrdinalIgnoreCase) pour obtenir un ensemble distinct de chaînes de caractères sans tenir compte de la casse.

0 votes

Est-ce que Distinct honore l'ordre original des éléments ?

1 votes

@asyrov : de MSDN : The Distinct() method returns an unordered sequence that contains no duplicate values.

58voto

Arcturus Points 14366

Voici le HashSet<string> approche :

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

Malheureusement, cette solution nécessite également le framework .NET 3.5 ou plus, car HashSet n'a été ajouté qu'à cette version. Vous pouvez également utiliser array.Distinct() qui est une caractéristique de LINQ.

11 votes

Cela ne permettra probablement pas de préserver l'ordre original.

12voto

Matthew Schinckel Points 15596

Si vous aviez besoin de les trier, vous pourriez mettre en place un tri qui supprime également les doublons.

On fait d'une pierre deux coups, alors.

7 votes

Comment le triage permet-il de supprimer les doublons ?

9 votes

Qui a voté pour ça ? Ce n'est pas une réponse. "Comment faire des crêpes ?" "Mettez des ingrédients dans un arc et mélangez."

2 votes

Correct, ce n'est effectivement pas une réponse. C'était un commentaire, fait avant que StackOverflow avait commentaires, je crois. Cette question a été posée lorsqu'il y avait moins de 10 000 questions sur SO.

9voto

rjzii Points 8979

Si le tableau n'est jamais aussi grand et que vous ne vous souciez pas de trier la liste, vous pouvez essayer quelque chose de similaire à ce qui suit :

    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));
    }

4 votes

Vous devriez utiliser List au lieu de ArrayList.

7voto

Muhammad Mubashir Points 530

-- C'est Question d'entretien demandé à chaque fois. Maintenant j'ai fait son codage.

static void Main(string[] args)
{    
            int[] array = new int[] { 4, 8, 4, 1, 1, 4, 8 };            
            int numDups = 0, prevIndex = 0;

            for (int i = 0; i < array.Length; i++)
            {
                bool foundDup = false;
                for (int j = 0; j < i; j++)
                {
                    if (array[i] == array[j])
                    {
                        foundDup = true;
                        numDups++; // Increment means Count for Duplicate found in array.
                        break;
                    }                    
                }

                if (foundDup == false)
                {
                    array[prevIndex] = array[i];
                    prevIndex++;
                }
            }

            // Just Duplicate records replce by zero.
            for (int k = 1; k <= numDups; k++)
            {               
                array[array.Length - k] = '\0';             
            }

            Console.WriteLine("Console program for Remove duplicates from array.");
            Console.Read();
        }

3 votes

Vous ne devriez pas faire une complexité en temps O(n*2) pour une telle question.

2 votes

Vous devriez utiliser le tri par fusion

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X