【问题标题】:C# equivalent of std::sort and std::uniqueC# 等效于 std::sort 和 std::unique
【发布时间】:2010-09-20 21:09:29
【问题描述】:

我有一个 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;
    }

【问题讨论】:

    标签: c# .net sorting unique


    【解决方案1】:

    您使用的是什么版本的 .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)
    

    【讨论】:

      【解决方案2】:

      如果您认为 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);
      });
      

      【讨论】:

      • 我不认为排序有太多好处 - 据我了解,HashSet 没有特定的顺序。另外它是 .NET 3.5(OP 只有 .NET 2.0)
      【解决方案3】:

      即使使用 .NET 2.0,您也可以使用 LINQBridge 获得相同的结果。这将更容易与 C# 3.0 一起使用(即使与 .NET 2.0 一起使用),但应该可以与 C# 2.0 和 .NET 2.0 一起使用 - 你只需要使用 Enumerable.Distinct(x) 而不是 x.Distinct();

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

      【讨论】:

        【解决方案4】:

        唉,我只有 .NET 2.0 可以使用

        【讨论】:

          【解决方案5】:

          顺便说一句,C# 有一个 System.Array.Sort 静态方法,您可以使用该方法对实际数组进行排序,而无需使用集合。

          【讨论】:

            【解决方案6】:

            我不知道您的集合有多大,但如果您不处理数千个整数,这可能就足够了:

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

            【讨论】:

              【解决方案7】:
                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;
                }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2020-11-03
                • 2011-01-19
                • 2016-08-10
                • 1970-01-01
                • 2016-02-12
                • 2016-11-20
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多