以下の文字列のリストがあります
List A = {"1","2","3"}
List B = {
"1,2,3,4,5,6,7",
"1,2,6,7",
"1",
"4,5,6",
"6,7"
}
リスト A と完全または部分的に一致するリスト B のすべてのアイテムを取得したい
つまりアウトプットしたい
Result = {
"1,2,3,4,5,6,7",
"1,2,6,7",
"1"
}
Linqでこれを行う方法は?
各カンマ区切りの文字列をコレクションに変換し、そのコレクションにリストと共通の項目があるかどうかを確認する必要がありますA
。これは LINQ で簡単に実行できます。
var matches = B.Where(s => s.Split(',').Intersect(A).Any()).ToList();
英語で:
B
(分割された後に) と共通する項目が少なくとも 1 つある文字列を検索A
し、結果のリストを作成します。
A
入れてまとめる項目の総数B
がかなりの場合、この方法はあまり効率的ではないことに注意してください。A
に前処理しHashSet<string>
、フィルターを次のように書き換えることで、状況を改善できます。
var set = new HashSet<string>(A);
var matches = B.Where(s => s.Split(',').Any(n => set.Contains(n))).ToList();
このバージョンは同じ結果を生成し、大きな入力の場合ははるかに高速になります。
あなたが欲しいのはこのようなものです
string[] A = { "1", "2", "3" };
string[] B = { "1,2,3,4,5,6,7", "1,2,6,7", "1", "4,5,6", "6,7"};
var Result = from string S in B
where A.Any(i => S.Contains(i))
select S;