2012-03-28 6 views
0

私は2人の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. 誰かがどのように私に助言することができ、私は、arraylistに戻すvarタイプを変換することができませんでしたか?
  2. 最初に間違った方法を選択しましたか?あなたのアドバイスは高く評価されます。

は、すべての

+2

なぜあなたが最初の場所で 'ArrayList'を使用していますか?これは理由がありません。リストを使用してください。リスト BrokenGlass

+0

@BrokenGlass私はレガシーコードを扱っています... – rofans91

+0

@ M.Babcock 'int' – rofans91

答えて

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

3

レガシーコードを扱っているので、あなただけのシンプルなforeachループを使用することができます:ArrayListの代わりにList<int>を使用するようにコードをリファクタリングする

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

これは本当にかかわらず、パッチワークされたが、それは非常に望ましいだろうが - 努力はあまり重くはならず、すぐに恩返しします。

+0

なぜあなたは 'ToList'と' AddRange'(あるいは 'ToList')を使わないのでしょうか? –

+0

それはテストを与えるだろう:) – rofans91

+0

@ M.Babcockそれは別のオプションかもしれない - それはフードの下で同じですが、あなたは "捨てる"コレクションを作成している(それは私が推測するものではない) – BrokenGlass

1

これは、タイプを明示的に書き留めるためのショートカットとしてvarキーワードを使用すると、問題に陥る可能性があります。 Intersect LINQ拡張の返品を確認した場合、返品はIEnumerable<int>であることがわかります。あなたはArrayListIEnumerableによって表されるデータを転送するIEnumerable拡張メソッドの一部を使用することができます。

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; 
} 
関連する問題