質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

LINQ

LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

16302閲覧

Linq(ラムダ式)で複数条件による処理の分岐がしたい

tsumayoji13

総合スコア3

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

LINQ

LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

1クリップ

投稿2021/11/20 05:54

前提・実現したいこと

Linqのラムダ式を用いてジャグ配列jagArrayの各要素を評価(という言い方でいいのでしょうか?)して
例として1000以上ならA,100以上ならB,100未満だったらCに置換して表示させたいとします。
三項演算子を入れ子にすれば複数条件をSelect内で使えるのですが条件が増えるにつれてとても読みにくくなってしまいます。
三項演算子ではなくif文を用いた書き方またはもっと読みやすい書き方は出来るのでしょうか?

ソースコード

C#

1 int[][] jagArray = 2 { 3 new int[]{10,50,500,1000}, 4 new int[]{100,50,1,}, 5 new int[]{500,10}, 6 new int[]{50}, 7 }; 8 9 foreach (var item in jagArray) 10 { 11 var q = item.Select(x => x >= 100 ? (x >= 1000 ? "A" : "B") : "C"); 12 Console.WriteLine(string.Join(" ", q)); 13 }

実行結果

C C B A B C C B C C

Select()内でifを入力するとifは無効と出てしまいます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2021/11/20 08:41 編集

スイッチ式 ABC と 100 と 1000 が変わらないのであれば "CBA"[(int)Math.log10(x / 10)]
tsumayoji13

2021/11/20 09:04

回答ありがとうございます。 switch式はバージョン8以降でないと使用できないようなのでアップデート出来たら試したいと思います。
guest

回答1

0

ベストアンサー

ちょっと興味を覚えたご質問でしたので試してみました。

Select()内でifを入力するとifは無効と出てしまいます。

このこと自体は、Selectメソッドの中でラムダ式を使うようにすればクリアできます。提示のコードの延長であれば、以下のようなコードになるでしょうか。

C#

1q = item.Select((x) => 2{ 3 if (x >= 1000) 4 { 5 return "A"; 6 } 7 if (x >= 100) 8 { 9 return "B"; 10 } 11 return "C"; 12});

あとは、3項演算子の考え方の延長程度になりますが、条件を判定するメソッドを各々用意して値を引き渡していくなど。例えば以下のようなCond1, Cond2, Cond3のようなメソッドを用意して、順に判定させていく。条件をパスしなければ次のメソッドに引き渡す。

C#

1 static string Cond1(int v) 2 { 3 if (v >= 1000) 4 { 5 return "A"; 6 } 7 else 8 { 9 return Cond2(v); 10 } 11 } 12 13 static string Cond2(int v) 14 { 15 if (v >= 100) 16 { 17 return "B"; 18 } 19 else 20 { 21 return Cond3(v); 22 } 23 } 24 25 static string Cond3(int v) 26 { 27 return "C"; 28 } 29

この案は、以下のように使います。

C#

1q = item.Select(x => Cond1(x));

全部まとめたコードを示しておきます。

C#

1using System; 2using System.Linq; 3 4class Program 5{ 6 static void Main(string[] args) 7 { 8 int[][] jagArray = 9 { 10 new int[]{10,50,500,1000}, 11 new int[]{100,50,1,}, 12 new int[]{500,10}, 13 new int[]{50}, 14 }; 15 16 foreach (var item in jagArray) 17 { 18 var q = item.Select(x => x >= 100 ? (x >= 1000 ? "A" : "B") : "C"); 19 Console.WriteLine(string.Join(" ", q)); 20 21 q = item.Select((x) => 22 { 23 if (x >= 1000) 24 { 25 return "A"; 26 } 27 if (x >= 100) 28 { 29 return "B"; 30 } 31 return "C"; 32 }); 33 Console.WriteLine(string.Join(" ", q)); 34 35 q = item.Select(x => Cond1(x)); 36 Console.WriteLine(string.Join(" ", q)); 37 } 38 } 39 40 static string Cond1(int v) 41 { 42 if (v >= 1000) 43 { 44 return "A"; 45 } 46 else 47 { 48 return Cond2(v); 49 } 50 } 51 52 static string Cond2(int v) 53 { 54 if (v >= 100) 55 { 56 return "B"; 57 } 58 else 59 { 60 return Cond3(v); 61 } 62 } 63 64 static string Cond3(int v) 65 { 66 return "C"; 67 } 68}

実行すると以下のように同じ結果を得ます。.NET Framework 4.5で試したコードなので、C#自体のバージョンも特に最新のものでなくて大丈夫です。

terminal

1PS C> .\ConsoleApp1.exe 2C C B A 3C C B A 4C C B A 5B C C 6B C C 7B C C 8B C 9B C 10B C 11C 12C 13C 14PS C>

「質問への追記・修正の依頼」欄で既にコメントをいただいているように、別の良い方法もありそうです。

投稿2021/11/20 07:32

dodox86

総合スコア9256

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2021/11/20 07:42

尚、Cond1,Cond2,,CondN のコード案は再帰処理のように呼び出し階層が深くなっていくものなので、取り扱い注意です。(思い付きで書いたコードなのですみません)
tsumayoji13

2021/11/20 09:15

回答ありがとうございます。 if文を{}で囲んだらうまくいきました。 処理内容が長くなる場合に使っていけそうです。 メソッドの引き渡しも面白いですね。 var q1 = item.Select(x => x >= 1000 ? "A" : x >= 100 ? "B" : "C"); の様に三項演算子の入れ子を改行するのはありでしょうか?
tsumayoji13

2021/11/20 10:08

ありがとうございます。 簡単な条件式は三項演算子で使い分けてみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問