初投稿です。
練習兼自分用のメモとして書いていきます。
内容はコレクションをキーにして、別のコレクションから要素を取り出すだけです。
下記のコレクションを用意しました。
keyListを検索キーとして、listから要素の取り出しを試みます。
結果はresultに格納します。
//検索対象コレクション
List<string> list = new List<string>();
list.Add("kinoko");
list.Add("shimeji");
list.Add("takenoko");
list.Add("nameko");
list.Add("eringi");
//検索キーコレクション
List<string> keyList = new List<string>();
keyList.Add("shimeji");
keyList.Add("eringi");
//検索結果格納用コレクション
List<string> result = new List<string>();
①多重ループで取り出す
とにかく簡単にやるなら。
List<string> result = new List<string>();
foreach(string line in list)
{
foreach(string key in keyList)
{
if(line == key)
{
result.Add(line);
}
}
}
②LINQで取り出す
シンプルに書けます。後から見やすいのもGood。
result = list.Where(x => keyList.Contains(x)).ToList();
基本的に②の方法を使って、うまくいかない場合は①を使う、でいいのではないでしょうか。
おまけ①不一致の要素を取り出す
検索キーにヒットしない要素を取り出すには、Exceptメソッドを使用します。
result = list.Except<string>(keyList.AsEnumerable<string>()).ToList();
おまけ②コレクションを要素として持つコレクションを検索対象にする。
コレクションを要素として持つコレクションから要素を取り出すには、SelectManyを使用します。
List<string> child1 = new List<string>();
child1.Add("kinoko");
child1.Add("shimeji");
child1.Add("takenoko");
List<string> child2 = new List<string>();
child2.Add("nametake");
child2.Add("kikurage");
child2.Add("bunashimeji");
List<string> child3 = new List<string>();
child3.Add("tengu");
child3.Add("eringi");
child3.Add("shitake");
List<List<string>> parent = new List<List<string>>();
parent.Add(child1);
parent.Add(child2);
parent.Add(child3);
result = parent.SelectMany(x => x).Where(x => keyList.Contains(x)).ToList();