0

任意の数のリストがあるとします

List<int> List1 = new List<int>();
List<int> List2 = new List<int>();
List<int> ListN = new List<int>();

すべてのリストに存在する要素のみを含む最終リストを取得するにはどうすればよいですか?

最初はこれを多くのループで行いました。しかし、私は満足していませんでした。LINQ に関する私の知識が限られているため、簡単に実行できると思いますが、どこから始めればよいかわかりません。

できればLINQを使用して、これを行う他の方法はありますか。

4

4 に答える 4

2
List<List<int>> lists = new List<List<int>>{
                           List2, ..., ListN
                         };
IEnumerable<int> result = List1;
foreach(var list in lists){
  result = result.Intersect(list);
  if(!result.Any()) break;
}
//Use ToList() on result to get List<int>
于 2013-10-07T15:49:56.053 に答える
1

使用するIntersect

var r = List1.Intersect(List2).Intersect(ListN);

例:

var r = new [] { 1, 2, 3, 4 }
    .Intersect(new [] { 2, 3, 4, 5 })
    .Intersect(new [] { 3, 4, 5, 6 });
// r now contains 3, 4

ドキュメント: http://msdn.microsoft.com/en-us/library/bb460136.aspx

以下は、リストのリストを受け取り、それらすべてに対して共通部分を実行する拡張メソッドです。上記と同じですが、おそらく使いやすいですか?

public static IEnumerable<T> IntersectAll<T>(
   this IEnumerable<T> list, 
   params IEnumerable<T>[] otherLists
) {
    foreach (var otherList in otherLists)
    {
        list = list.Intersect(otherList);
    }
    return list;
}

使用法:

var r = new [] { 1, 2, 3, 4 }
     .IntersectAll(new [] { 2, 3, 4, 5 }, new [] { 3, 4, 5, 6 });
于 2013-10-07T15:49:50.610 に答える
0

LINQの方法を使用することもできますがIntersect、その結果、常に現在の交差点を取得し、それらの項目を新しいものに再設定することになりHashSetます。独自の明示的な使用によりHashSet、N シーケンスの交差をより効率的に取得できます。

public static IEnumerable<T> intersectAll<T>(IEnumerable<IEnumerable<T>> source)
{
    using (var iterator = source.GetEnumerator())
    {
        if (!iterator.MoveNext())
            return Enumerable.Empty<T>();

        var set = new HashSet<T>(iterator.Current);
        while (iterator.MoveNext())
            set.IntersectWith(iterator.Current);

        return set;
    }
}
于 2013-10-07T15:54:10.397 に答える
0

ものすごく単純:

var intersection = List1.Intersect(List2).Intersect(List3);

または、 n個のリストを簡単にサポートしたい場合:

var lists = new List<List<string>>();

lists.Add(new List<string>(new string[] { "Test1", "Test2", "Test3" }));
lists.Add(new List<string>(new string[] { "Test1", "Test2", "Test4" }));
lists.Add(new List<string>(new string[] { "Test1", "Test2", "Test5" }));
lists.Add(new List<string>(new string[] { "Test1", "Test2", "Test6" }));

var aggregate = lists.Aggregate((x, y) => x.Intersect(y).ToList());
于 2013-10-07T15:49:57.330 に答える