2012-03-28 79 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; 
}