Listに格納された配列を検索する方法について

タグの編集
投稿者 (削除されました)  () 投稿日時 2023/5/8 16:30:00
(削除されました)
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2023/5/9 12:44:12
質問時には Visual Studio のバージョンと、プロジェクトのターゲット フレームワーク バージョンも
書いて頂けると助かります。

進化の止まった VB とは異なり、C# は頻繁に機能強化が行われるので、
バージョン間の機能差が強くでます。そのため、実行環境によっては、
回答例のコードが使えないことがおこりえるためです。質問時には環境も明示しましょう。


> この中の配列には、数値と名称が入っており、例えば
10 の前に書かれている全角空白は、半角空白の誤記でしょうか?
他の項目は半角空白なのに、1 つだけ全角が混じっている…。

おそらくは空白なしの文字列がセットされているのだと思いますが、もしも
質問文そのままに全角空白を維持するとなると、こんな感じになってしまう…。

List<string[]> zissekiList = new List<string[]>

    new[]{ " 10"" りんご"},
    new[]{ " 20" , " みかん"},
};



> ある数値で数値の列に検索をかけ、その名称を取得するということをしたいのですが、
// record = new string[] {"20""みかん"}; がセットされる
string[]? record = zissekiList.Find(cols => cols?[0] == "20");

のような感じです。null 許容コンテキストを有効にしていない場合はこうですね。
該当する項目が無い場合、null が返却されます。
string[] record = zissekiList.Find(cols => cols[0] == "20");


値 "20" に該当する項目が複数存在するようなケースでは、FindAll を使います。
この場合の戻り値は List<> であり、見つからない場合は 0 件の List<> が返却されます。
var records = zissekiList.FindAll(cols => cols?[0] == "20");



結果を string[] で得るのではなく、string 値の "みかん" だけで良いのなら、こう書けます。
いずれも、該当項目が存在しないとエラーになるのでご注意を。
string fruits0 = zissekiList.Find(cols => cols[0] == "20")[1];
string fruits1 = zissekiList.Single(cols => cols[0] == "20")[1];
string fruits2 = zissekiList.First(cols => cols[0] == "20")[1];
string fruits3 = zissekiList.SingleOrDefault(cols => cols[0] == "20")[1];
string fruits4 = zissekiList.FirstOrDefault(cols => cols[0] == "20")[1];


.Find と .First は同義です。
.Find が List<> のインスタンスメソッドであるのに対し、
.First は拡張メソッドであるという違いがあるだけです。
いずれも 発見できないと null が返されるので、末尾に[1]を付けた場合、
未発見時に NullReferenceException を誘発する可能性があることにご注意ください。

.Single は、「該当メンバーが一つしか無いとわかっているとき」に使います。
該当メンバーが複数存在していた場合や、該当メンバーが存在しないとエラーになります。

存在しない場合に結果を null にしたい場合は、null 条件演算子を併用できます。
string fruits0 = zissekiList.Find(cols => cols[0] == "20")?[1];



存在しない場合に、特定の文字列で代用したい場合は、DefaultIfEmpty を併用することもできます。
var fruitsName = zissekiList.Where(cols => cols[0] == "2000").DefaultIfEmpty(new string[] { "", "Null" }).First()[1];