6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

コレクションをキーにして、別のコレクションから要素を取り出す方法

Posted at

初投稿です。

練習兼自分用のメモとして書いていきます。

内容はコレクションをキーにして、別のコレクションから要素を取り出すだけです。


下記のコレクションを用意しました。
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();
6
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?