Frage

Ich habe eine Liste von ganzen Zahlen in C #. Ich wünschte, um Duplikate zu entfernen. In C ++ Ich würde es durch die std :: sort läuft und dann std :: einzigartige Algorithmen für eine sehr effiziente Möglichkeit, die einzigartige Liste zu erhalten.

Was ist der beste Weg, um die gleiche Sache in C # zu tun? Mit anderen Worten, ich suche nach einem eleganteren Weg, um den folgenden Code zu tun:

    private static int[] unique(int[] ids)
    {
        IDictionary<int, object> d = new Dictionary<int, object>();
        foreach(int i in ids)
            d[i] = null;

        int[] results = new int[d.Count];
        int j = 0;
        foreach(int id in d.Keys)
            results[j++] = id;

        return results;
    }
War es hilfreich?

Lösung

Welche Version von .NET verwenden Sie?

In .NET 3.5, die so einfach ist wie der Aufruf der Distinct () Erweiterungsmethode und dann ToArray () wenn Sie müssen eine Reihe wirklich wieder.

Zum Beispiel:

int[] x = new[] { 1, 4, 23, 4, 1 };
int[] distinct = x.Distinct().ToArray();
// distinct is now { 1, 4, 23 } (but not necessarily in that order)

Andere Tipps

Wenn Sie STL Methoden als "sehr effizient" bedenkt, so Verwendung folgenden:

       var vals = new List<int> { 1, 2, 3, 2, 1, 2, 3, 2, 3, 4, 3, 2, 3 };
       vals.Sort();
       var uniques = new HashSet<int>(vals);

Für 2,0 Äquivalent

List<int> vals = new List<int>();
vals.Add(1);
vals.Add(2);
vals.Add(3);
vals.Add(2);
...
vals.Sort();
List<int> uniques = new List<int>();
vals.ForEach(delegate(int v) {
 if (!uniques.Contains(v)) uniques.Add(v);
});

Auch mit .NET 2.0, könnten Sie das gleiche bekommen mit LINQBridge . Dies wird leichter sein, mit C # 3.0 zu verwenden (auch mit .NET 2.0), soll aber mit C # 2.0 und .NET 2.0 nutzbar sein - Sie würden einfach Enumerable.Distinct verwenden müssen (x) statt x.Distinct ();

Natürlich letztlich das sind nur pre-wrapped Versionen des Codes zuvor veröffentlicht (Give-oder-nehmen die Dinge wie Iterator Blöcke), so dass Sie nur diesen Code in eine Utility-Klasse drücken könnte und (wieder) verwenden Sie es aus es.

Ach ich nur .NET 2.0 für die Arbeit mit

Auf einem halbwegs Beachtet, C # hat eine System.Array.Sort statische Methode, die Sie ohne die Verwendung einer Sammlung realen Arrays sortieren verwenden können.

Ich weiß nicht, wie groß Ihre Sammlung ist, aber wenn man nicht mit Tausenden von ganzen Zahlen zu tun hat, könnte dies gut genug sein:

public IEnumerable<int> unique(int[] ids)
{
    List<int> l = new List<int>();
    foreach (int id in ids)
    {
        if (!l.Contains(id))
        {
            l.Add(id);
            yield return id;
        }
    }
}
  private static List<T> GetUnique<T>(List<T> list) where T : IEquatable<T>
  {
     list.Sort();
     int count = list.Count;
     List<T> unique = new List<T>(count);
     T last = default(T);
     for (int i = 0; i < count; i++)
     {
        T val = list[i];
        if (i != 0 && last.Equals(val)) continue;
        last = val;
        unique.Add(val);
     }
     return unique;
  }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top