2012-03-28 78 views
0

我试图通过将两个ArrayList共享的值提取到另一个ArrayList中。在2 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. 我在第一个地方选择了错误的方法吗?感谢您的建议。

感谢大家的亲切关怀=)

+2

你为什么首先使用'ArrayList'?这是没有理由的,使用'List ' – BrokenGlass 2012-03-28 02:00:39

+0

@BrokenGlass我正在处理遗留代码... – rofans91 2012-03-28 02:01:40

+0

@ M.Babcock' int' – rofans91 2012-03-28 02:01:59

回答

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

首先,ArrayList的是前泛型引入到.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}  

如果您处于传统模式,那么泛型将不会提供给您,您将不得不手动迭代列表以找到交集。

+0

我的确在使用遗留代码.. – rofans91 2012-03-28 02:05:24

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 - 中努力不应该太多,它会立即付清。

+0

为什么不使用'ToList'和'AddRange'(或者可能不是'ToList')? – 2012-03-28 02:05:55

+0

将给它一个测试:) – rofans91 2012-03-28 02:07:43

+0

@ M.Babcock这将是另一种选择 - 尽管它是相同的引擎盖下,你正在创建一个“扔掉”集合(不是我认为这很重要) – BrokenGlass 2012-03-28 02:07:53

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