4

C# に整数のリストがあります。重複を削除したい。C++ では、一意のリストを取得する非常に効率的な方法として、std::sort アルゴリズム、次に std::unique アルゴリズムを実行します。

C#で同じことを行う最良の方法は何ですか? 言い換えれば、次のコードを実行するためのよりエレガントな方法を探しています。

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

7 に答える 7

8

使用している .NET のバージョンは何ですか?

.NET 3.5 では、 Distinct()拡張メソッドを呼び出してから、本当に配列が再び必要な場合はToArray()を呼び出すのと同じくらい簡単です。

例えば:

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)
于 2008-11-05T14:11:14.683 に答える
3

STL メソッドを「非常に効率的」と考える場合は、以下を使用してください。

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

2.0相当の場合

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);
});
于 2008-11-05T14:24:08.497 に答える
1

.NET 2.0 でも、 LINQBridgeで同じことができます。これは C# 3.0 (.NET 2.0 でも) で使用する方が簡単ですが、C# 2.0 および .NET 2.0 でも使用できるはずです。

もちろん、最終的には、以前に投稿したコードのラップ済みバージョン (イテレータ ブロックのようなギブ オア テイクのもの) にすぎないため、そのコードをユーティリティ クラスにプッシュして、そこから (再) 使用することができます。

于 2008-11-05T14:17:50.117 に答える
0
  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;
  }
于 2010-02-02T02:46:58.223 に答える
0

残念ながら、私は.NET 2.0しか使用できません

于 2008-11-05T14:14:38.220 に答える
0

途中で関連するメモとして、C# には、コレクションを使用せずに実際の配列を並べ替えるために使用できるSystem.Array.Sort静的メソッドがあります。

于 2008-11-05T14:31:49.590 に答える
0

コレクションの大きさはわかりませんが、何千もの整数を扱っていない場合は、これで十分かもしれません。

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;
        }
    }
}
于 2008-11-05T14:31:58.323 に答える