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を返す必要があります
最初に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
}
パフォーマンスポイントから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個のみの場合(または、関係ない場合は反対);-)
リストとして結果を取得したい場合、最後の行で結果を変換します(結果のみ)。
構造体(または文字列)ではなくオブジェクトがある場合は、まずそれらのキーを交差させてから、それらのキーでオブジェクトを選択する必要があります。
var ids = list1.Select(x => x.Id).Intersect(list2.Select(x => x.Id));
var result = list1.Where(x => ids.Contains(x.Id));