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 一起使用 - 你只需要使用 Enumerable.Distinct(x) 而不是 x.Distinct();

当然,最终这些只是您之前发布的代码的预包装版本(给予或接受诸如迭代器块之类的东西),因此您可以将该代码推送到实用程序类中并从那里(重新)使用它。

于 2008-11-05T14:17:50.117 回答
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 回答
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 回答