web-dev-qa-db-ja.com

C#で2つのリストを交差させる

2つのリストがあります。

_  List<int> data1 = new List<int> {1,2,3,4,5};
  List<string> data2 = new List<string>{"6","3"};
_

私は次のようなことをしたい

_var newData = data1.intersect(data2, lambda expression);
_

data1[index].ToString() == data2[index]の場合、ラムダ式はtrueを返す必要があります

43
Merni

最初にdata1を変換する必要があります。この場合、各要素でToString()を呼び出します。

文字列を返したい場合に使用します。

List<int> data1 = new List<int> {1,2,3,4,5};
List<string> data2 = new List<string>{"6","3"};

var newData = data1.Select(i => i.ToString()).Intersect(data2);

整数を返したい場合に使用します。

List<int> data1 = new List<int> {1,2,3,4,5};
List<string> data2 = new List<string>{"6","3"};

var newData = data1.Intersect(data2.Select(s => int.Parse(s));

すべての文字列が数字ではない場合、これは例外をスローすることに注意してください。したがって、最初に次のことを確認してください。

int temp;
if(data2.All(s => int.TryParse(s, out temp)))
{
    // All data2 strings are int's
}
67
George Duckett

パフォーマンスポイントから2つのリストに大幅に異なる要素の数が含まれる場合、このようなアプローチを試すことができます(条件演算子?:を使用):

1.まず、コンバーターを宣言する必要があります:

Converter<string, int> del = delegate(string s) { return Int32.Parse(s); };

2.次に、条件演算子を使用します:

var r = data1.Count > data2.Count ?
 data2.ConvertAll<int>(del).Intersect(data1) :
 data1.Select(v => v.ToString()).Intersect(data2).ToList<string>().ConvertAll<int>(del);

長いリストのタイプに一致するように、短いリストの要素を変換します。 実行速度を想像してください。最初のセットに1000個の要素が含まれ、2番目の要素が10個のみの場合(または、関係ない場合は反対);-)

リストとして結果を取得したい場合、最後の行で結果を変換します(結果のみ)。

7
Slava Kovalchuk

構造体(または文字列)ではなくオブジェクトがある場合は、まずそれらのキーを交差させてから、それらのキーでオブジェクトを選択する必要があります。

var ids = list1.Select(x => x.Id).Intersect(list2.Select(x => x.Id));
var result = list1.Where(x => ids.Contains(x.Id));
3
alexkovelsky