【问题标题】:How to take distinct/unique values from arraylist? [duplicate]如何从arraylist中获取不同/唯一的值? [复制]
【发布时间】:2014-02-28 07:21:45
【问题描述】:

是否可以从 c# 中的 arraylist 中获取唯一值?,实际上我有一个包含值 = 100,101,102,101,100,102,103 的 arraylist,但我希望从中获取唯一值,例如 100,101,102,103。那么从 arralist 中获取不同/唯一值的 c# 语法是什么?

我试过了

Arraylist Others=new Arraylist(); 
others=TakeanotherValues();
others.Distinct().Toarray();

但错误是“System.Collection.ArrayList 不符合 Distinct 的定义”

【问题讨论】:

  • 你能发布你的试用代码吗?
  • Arraylist Others=new Arraylist(); others=TakeanotherValues();others.Distinct().Toarray();
  • 不要再使用ArrayList。它属于 C# 没有 Generics 的旧时代。请改用List<T>
  • 请不要在问题标题中包含有关所用语言的信息,除非没有它就没有意义。标记用于此目的。
  • 使用 linq 时仍然报错

标签: c# arraylist


【解决方案1】:

你可以使用 Linq:

var distinctArraylist = yourArrayList.ToArray().Distinct();

【讨论】:

    【解决方案2】:
    ArrayList list = new ArrayList();
    list.Add(1);
    list.Add(2);
    list.Add(3);
    list.Add(1);
    
    IEnumerable<int> values = list.Cast<int>().Distinct();
    

    打印出唯一值。

    【讨论】:

      【解决方案3】:

      除非您绝对必须(例如,因为您使用的是 .NET 1),否则请不要使用 ArrayList,它是一个旧的非泛型类。相反,在 System.Collections.Generic 命名空间中使用 List&lt;T&gt;,例如List&lt;int&gt;List&lt;object&gt;(后者在功能上等同于 ArrayList,因为您可以向其中添加任何内容)。
      通常,除非您确定自己在做什么,否则不要直接在 System.Collections 中使用任何内容;请改用System.Collections.Generic 中的集合。

      您可以对数据使用 LINQ 方法 Distinct(),但如果您想使用 ArrayList,您首先需要使用 Cast&lt;object&gt;() 将其转换为 IEnumerable&lt;T&gt;,如下所示:

      using System.Linq;
      
      // ...
      
      var distinctItems = myList.Cast<object>().Distinct();
      

      这相当于手动创建一个集合(例如HashSet&lt;object&gt;),将列表中的每个项目添加到其中,然后他们从该集合中创建一个列表,因为根据定义,集合不会保留重复的项目(它们不会'如果你插入一个也不会抱怨,他们只是忽略它)。

      【讨论】:

        【解决方案4】:

        一种可能的解决方案是循环数组列表项,并将每个项插入一个新集合中。 这样Set数据结构就保证了item的唯一性。

        using System.IO;
        using System;
        using System.Collections;
        using System.Collections.Generic;
        
        class Program
        {
            static void Main()
            {
                ArrayList numbers = new ArrayList() {100, 100, 200, 201, 202};
                HashSet<int> uniqueNumbers = new HashSet<int>();
                foreach(int number in numbers) {
                    uniqueNumbers.Add(number);
                }
                foreach(int number in uniqueNumbers) {
                    Console.WriteLine(number);
                }
        
            }
        }
        

        【讨论】:

        • 这可能是最好的非 LINQ 解决方案,因为这是 Distinct() 在内部所做的。 (这里是 Distinct 实现的source
        • 感谢@SolalPirelli。自从我很久以前切换到开源以来,之前没有使用过 Linq :)
        【解决方案5】:

        由于 ArrayList 实现了 IEnumerable 而不是 IEnumerable&lt;T&gt;,因此您需要先转换它,然后才能应用常规 LINQ 操作:

        var distinctArrayList = new ArrayList((ICollection)myArrayList.Cast<int>().Distinct().ToArray());
        

        【讨论】:

          【解决方案6】:

          试试这个:

          (from obj in _arrayList obj).Distinct();
          

          【讨论】:

          • 这不会编译,你缺少一个select。另外,使用LINQ语法有点矫枉过正,Cast&lt;object&gt;就够了。
          猜你喜欢
          • 1970-01-01
          • 2012-11-05
          • 2021-06-06
          • 2019-08-26
          • 2019-12-01
          • 2017-01-03
          • 2014-05-01
          • 1970-01-01
          相关资源
          最近更新 更多