在2个ArrayList之间找到相同的值并返回另一个ArrayList

时间:2012-03-28 01:58:58

标签: c# linq arraylist ienumerable

我正在尝试将两个arraylist共享的值提取到另一个arraylist中。

using System.Linq;

private ArrayList GetSameOf2AL(ArrayList first, ArrayList second)
        {
            ArrayList same = new ArrayList();

            var one = from int i in first select i;
            var two = from int i in second select i;

            var SameVal = one.Intersect(two);
            //I am supposed to convert or cast SameVal into arraylist here
            return same;
        }

我的问题是:

  1. 我无法将var类型转换回arraylist,有人可以告诉我怎么样?
  2. 我在第一时间选择了错误的方法吗?您的建议表示赞赏。
  3. 谢谢大家的关注=)

4 个答案:

答案 0 :(得分:3)

首先,ArrayList是一个过时的集合,在Generics引入.NET之前就已经使用了。除非您正在构建遗留代码,否则不应使用它。相反,你应该把注意力转向List类。

IEnumerable<int> first = new []{1,2,3};
IEnumerable<int> second = new [] {2,3,4};

List<int> intersection = first.Intersect(second).ToList(); // result {2,3}    

如果您处于遗留模式,则无法使用泛型,您必须手动迭代列表才能找到交集。

答案 1 :(得分:3)

由于您正在处理遗留代码,因此您只需使用简单的foreach循环:

private ArrayList GetSameOf2AL(ArrayList first, ArrayList second)
{
    ArrayList same = new ArrayList();

    var one = from int i in first select i;
    var two = from int i in second select i;

    var sameVal = one.Intersect(two);
    //I am supposed to convert or cast SameVal into arraylist here
    foreach (int i in sameVal)
        same.Add(i);
    return same;
}

这实际上是拼凑而成,重构您的代码以使用List<int>代替ArrayList会更好 - 努力不应该太多,它会立即得到回报。

答案 2 :(得分:2)

List<int> intersection = first.Cast<int>().Intersect(second.Cast<int>()).ToList();

ArrayList intersection = new ArrayList();
foreach (var i in first.Cast<int>().Intersect(second.Cast<int>()))
    intersection.Add(i);

答案 3 :(得分:1)

这是使用var关键字作为明确写出类型的快捷方式可能会让您遇到麻烦的时候。如果您已检查Intersect LINQ扩展名的返回,则会看到返回值为IEnumerable<int>。您可以使用部分IEnumerable扩展程序将IEnumerable代表的数据传输到ArrayList

private ArrayList GetSameOf2AL(ArrayList first, ArrayList second)
{
    ArrayList same = new ArrayList();

    var one = from int i in first select i;
    var two = from int i in second select i;

    same.AddRange(one.Intersect(two).ToArray<int>());
    return same;
}