配列がある場合:
var list1 = new int[] { 1,2,3,4,5};
var list2 = new int[] { 1,2,3};
var list3 = new int[] { 2,3};
すべてのリストで見つかった値のみを保持するのに役立つ方法は何ですか? この例では{2,3}
、これらの 2 つの値がすべてのリストにあるため、最終的には次のようになります。
配列がある場合:
var list1 = new int[] { 1,2,3,4,5};
var list2 = new int[] { 1,2,3};
var list3 = new int[] { 2,3};
すべてのリストで見つかった値のみを保持するのに役立つ方法は何ですか? この例では{2,3}
、これらの 2 つの値がすべてのリストにあるため、最終的には次のようになります。
使用Intersect
-> デフォルトの等値比較子を使用して値を比較することにより、2 つのシーケンスの積集合を生成します。(MSDN: http://msdn.microsoft.com/en-us/library/bb460136.aspx )
var list = list1.Intersect(list2).Intersect(list3);
このメソッドを使用して、任意の数のシーケンスの交差を取得できます。
public static IEnumerable<T> IntersectAll<T>(params IEnumerable<T>[] sequences)
{
if (!sequences.Any())
return Enumerable.Empty<T>();
var set = new HashSet<T>(sequences.First());
foreach (var sequence in sequences.Skip(1))
{
set.IntersectWith(sequence);
}
return set;
}
LINQIntersect
メソッドへの繰り返し呼び出しとは異なり、これは中間を繰り返し再構築しないことに注意してくださいHashSet
。全体で同じものを再利用します。
次のように、LINQ の一部である Intersect メソッドを使用できます。
var result = list1.Intersect(list2).Intersect(list3);
任意の数のリストを渡すことができるメソッドが必要な場合は、これを使用できます。
public static int[] Process(params int[][] values)
{
int[] result = values[0];
foreach (int[] value in values)
{
result = result.Intersect(value).ToArray();
}
return result;
}
次のように呼び出すことができます。
var result = Process(list1, list2, list3);