Frage

Ich habe die Arbeit mit einem string[] array in C#, die wird zurückgegeben, die von einem Aufruf der Funktion.Ich könnte vielleicht Stimmen, um eine Generic Sammlung, aber ich Frage mich, ob es einen besseren Weg, es zu tun, möglicherweise durch die Verwendung einer temp-array.

Was ist der beste Weg, um entfernen Sie Duplikate aus einem C# - array?

War es hilfreich?

Lösung

Sie könnte möglicherweise verwenden Sie eine LINQ-Abfrage, um dies zu tun:

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

Andere Tipps

Hier ist die HashSet<string> Ansatz:

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

Leider ist diese Lösung auch benötigt .NET framework 3.5 oder höher als HashSet wurde nicht Hinzugefügt, bis Sie diese version.Sie könnten auch verwenden array.Distinct(),, das ist eine Funktion von LINQ.

Wenn Sie brauchen, zu Sortieren, dann könnten Sie implementieren eine Art, das entfernt auch Duplikate.

Tötet zwei Vögel mit einem Stein, dann.

Die folgenden getesteten und funktionierenden code entfernen von Duplikaten aus einem array.Sie müssen das System.Collections-namespace.

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

Sie könnte wrap up in eine Funktion wenn Sie wollte.

Dies könnte davon abhängen, wie viel Sie wollen, Ingenieur der Lösung - wenn das array wird nie so groß sein und Sie kümmern sich nicht um die Sortierung der Liste möchten Sie vielleicht, um zu versuchen, etwas ähnliches wie das folgende:

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

-- Dies ist Interview-Frage fragte jedes mal.Jetzt habe ich getan, seine Kodierung.

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();
        }
List<String> myStringList = new List<string>();
foreach (string s in myStringArray)
{
    if (!myStringList.Contains(s))
    {
        myStringList.Add(s);
    }
}

Dies ist O(n^2), die keine Rolle für Sie eine kurze Liste, die gehen, um gefüllt werden in eine combo, kann aber schnell ein problem auf einem großen Sammlung.

protected void Page_Load(object sender, EventArgs e)
{
    string a = "a;b;c;d;e;v";
    string[] b = a.Split(';');
    string[] c = b.Distinct().ToArray();

    if (b.Length != c.Length)
    {
        for (int i = 0; i < b.Length; i++)
        {
            try
            {
                if (b[i].ToString() != c[i].ToString())
                {
                    Response.Write("Found duplicate " + b[i].ToString());
                    return;
                }
            }
            catch (Exception ex)
            {
                Response.Write("Found duplicate " + b[i].ToString());
                return;
            }
        }              
    }
    else
    {
        Response.Write("No duplicate ");
    }
}

Hier ist eine O(n*n) Ansatz, der verwendet O(1) Platz.

void removeDuplicates(char* strIn)
{
    int numDups = 0, prevIndex = 0;
    if(NULL != strIn && *strIn != '\0')
    {
        int len = strlen(strIn);
        for(int i = 0; i < len; i++)
        {
            bool foundDup = false;
            for(int j = 0; j < i; j++)
            {
                if(strIn[j] == strIn[i])
                {
                    foundDup = true;
                    numDups++;
                    break;
                }
            }

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

        strIn[len-numDups] = '\0';
    }
}

Die hash/linq Ansätze, die oben sind, was Sie normalerweise verwenden, in das wirkliche Leben.Jedoch in interviews, die Sie in der Regel wollen, um einige Einschränkungen, z.B.Konstante Raum die Regeln, hash oder keine internen api - die Regeln, mit LINQ.

Fügen Sie alle Fäden zu einem Wörterbuch und Holen Sie sich die Schlüssel-Eigenschaft hinterher.Dadurch wird jede eindeutige Zeichenfolge, die aber nicht notwendigerweise in der gleichen Reihenfolge Ihrer ursprünglichen Eingabe hatte Sie in.

Wenn Sie benötigen die Ende Ergebnis haben die gleiche Reihenfolge wie die ursprüngliche Eingabe, wenn man bedenkt, das erste mal vor jeder Zeichenfolge, verwenden Sie den folgenden Algorithmus statt:

  1. Eine Liste (Letzte Ausgabe) und ein Wörterbuch (check für Duplikate)
  2. Für jede Zeichenfolge in der Eingabe überprüfen, ob es im Wörterbuch vorhanden ist, die bereits
  3. Wenn nicht, fügen Sie es sowohl auf das Wörterbuch der Liste

Am Ende enthält die Liste das erste mal vor der jede eindeutige Zeichenfolge.

Stellen Sie sicher, dass Sie betrachten Dinge wie Kultur und so beim Bau Ihres Wörterbuchs, um sicherzustellen, dass Sie behandeln Duplikate mit akzentuierten Buchstaben richtig.

Das folgende Stück code versucht, Duplikate entfernen aus einer ArrayList obwohl dies nicht die optimale Lösung.Ich wurde gebeten, diese Frage in einem interview zu entfernen, Duplikate durch Rekursion und ohne Verwendung einer zweiten/temp arraylist:

private void RemoveDuplicate() 
{

ArrayList dataArray = new ArrayList(5);

            dataArray.Add("1");
            dataArray.Add("1");
            dataArray.Add("6");
            dataArray.Add("6");
            dataArray.Add("6");
            dataArray.Add("3");
            dataArray.Add("6");
            dataArray.Add("4");
            dataArray.Add("5");
            dataArray.Add("4");
            dataArray.Add("1");

            dataArray.Sort();

            GetDistinctArrayList(dataArray, 0);
}

private void GetDistinctArrayList(ArrayList arr, int idx)

{

            int count = 0;

            if (idx >= arr.Count) return;

            string val = arr[idx].ToString();
            foreach (String s in arr)
            {
                if (s.Equals(arr[idx]))
                {
                    count++;
                }
            }

            if (count > 1)
            {
                arr.Remove(val);
                GetDistinctArrayList(arr, idx);
            }
            else
            {
                idx += 1;
                GetDistinctArrayList(arr, idx);
            }
        }

Vielleicht hashset, die nicht speichern, duplizieren Sie Elemente, still und leise Anfragen ignorieren hinzufügen Duplikate.

static void Main()
{
    string textWithDuplicates = "aaabbcccggg";     

    Console.WriteLine(textWithDuplicates.Count());  
    var letters = new HashSet<char>(textWithDuplicates);
    Console.WriteLine(letters.Count());

    foreach (char c in letters) Console.Write(c);
    Console.WriteLine("");

    int[] array = new int[] { 12, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2 };

    Console.WriteLine(array.Count());
    var distinctArray = new HashSet<int>(array);
    Console.WriteLine(distinctArray.Count());

    foreach (int i in distinctArray) Console.Write(i + ",");
}

HINWEIS :NICHT getestet!

string[] test(string[] myStringArray)
{
    List<String> myStringList = new List<string>();
    foreach (string s in myStringArray)
    {
        if (!myStringList.Contains(s))
        {
            myStringList.Add(s);
        }
    }
    return myStringList.ToString();
}

Könnten tun, was Sie brauchen,...

BEARBEITEN Argh!!!geschlagen, um es von rob von unter einer minute!

Getestet unten & es funktioniert.Was ist cool ist, dass es eine Kultur empfindlich zu suchen

class RemoveDuplicatesInString
{
    public static String RemoveDups(String origString)
    {
        String outString = null;
        int readIndex = 0;
        CompareInfo ci = CultureInfo.CurrentCulture.CompareInfo;


        if(String.IsNullOrEmpty(origString))
        {
            return outString;
        }

        foreach (var ch in origString)
        {
            if (readIndex == 0)
            {
                outString = String.Concat(ch);
                readIndex++;
                continue;
            }

            if (ci.IndexOf(origString, ch.ToString().ToLower(), 0, readIndex) == -1)
            {
                //Unique char as this char wasn't found earlier.
                outString = String.Concat(outString, ch);                   
            }

            readIndex++;

        }


        return outString;
    }


    static void Main(string[] args)
    {
        String inputString = "aAbcefc";
        String outputString;

        outputString = RemoveDups(inputString);

        Console.WriteLine(outputString);
    }

}

--AptSenSDET

Dieser code zu 100% entfernen Sie doppelte Werte aus einem array[wie ich a[i]].....Können Sie konvertieren es in jeder OO-Sprache.....:)

for(int i=0;i<size;i++)
{
    for(int j=i+1;j<size;j++)
    {
        if(a[i] == a[j])
        {
            for(int k=j;k<size;k++)
            {
                 a[k]=a[k+1];
            }
            j--;
            size--;
        }
    }

}

Einfache Lösung:

using System.Linq;
...

public static int[] Distinct(int[] handles)
{
    return handles.ToList().Distinct().ToArray();
}

Generische Erweiterungsmethode :

public static IEnumerable<TSource> Distinct<TSource>(this IEnumerable<TSource> source, IEqualityComparer<TSource> comparer)
{
    if (source == null)
        throw new ArgumentNullException(nameof(source));

    HashSet<TSource> set = new HashSet<TSource>(comparer);
    foreach (TSource item in source)
    {
        if (set.Add(item))
        {
            yield return item;
        }
    }
}

Sie können Diesen code verwenden, wenn die Arbeit mit einer ArrayList

ArrayList arrayList;
//Add some Members :)
arrayList.Add("ali");
arrayList.Add("hadi");
arrayList.Add("ali");

//Remove duplicates from array
  for (int i = 0; i < arrayList.Count; i++)
    {
       for (int j = i + 1; j < arrayList.Count ; j++)
           if (arrayList[i].ToString() == arrayList[j].ToString())
                 arrayList.Remove(arrayList[j]);
public static int RemoveDuplicates(ref int[] array)
{
    int size = array.Length;

    // if 0 or 1, return 0 or 1:
    if (size  < 2) {
        return size;
    }

    int current = 0;
    for (int candidate = 1; candidate < size; ++candidate) {
        if (array[current] != array[candidate]) {
            array[++current] = array[candidate];
        }
    }

    // index to count conversion:
    return ++current;
}

Unten ist eine einfache Logik in java-Sie durchqueren Elemente von array-zweimal und wenn Sie sehen, jede gleiche element, das Sie zuordnen null und plus Sie nicht berühren Sie den index des Elements, die Sie vergleichen.

import java.util.*;
class removeDuplicate{
int [] y ;

public removeDuplicate(int[] array){
    y=array;

    for(int b=0;b<y.length;b++){
        int temp = y[b];
        for(int v=0;v<y.length;v++){
            if( b!=v && temp==y[v]){
                y[v]=0;
            }
        }
    }
}
  private static string[] distinct(string[] inputArray)
        {
            bool alreadyExists;
            string[] outputArray = new string[] {};

            for (int i = 0; i < inputArray.Length; i++)
            {
                alreadyExists = false;
                for (int j = 0; j < outputArray.Length; j++)
                {
                    if (inputArray[i] == outputArray[j])
                        alreadyExists = true;
                }
                        if (alreadyExists==false)
                        {
                            Array.Resize<string>(ref outputArray, outputArray.Length + 1);
                            outputArray[outputArray.Length-1] = inputArray[i];
                        }
            }
            return outputArray;
        }
using System;
using System.Collections.Generic;
using System.Linq;


namespace Rextester
{
    public class Program
    {
        public static void Main(string[] args)
        {
             List<int> listofint1 = new List<int> { 4, 8, 4, 1, 1, 4, 8 };
           List<int> updatedlist= removeduplicate(listofint1);
            foreach(int num in updatedlist)
               Console.WriteLine(num);
        }


        public static List<int> removeduplicate(List<int> listofint)
         {
             List<int> listofintwithoutduplicate= new List<int>();


              foreach(var num in listofint)
                 {
                  if(!listofintwithoutduplicate.Any(p=>p==num))
                        {
                          listofintwithoutduplicate.Add(num);
                        }
                  }
             return listofintwithoutduplicate;
         }
    }



}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top