ちょっと興味を覚えたご質問でしたので試してみました。
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>
「質問への追記・修正の依頼」欄で既にコメントをいただいているように、別の良い方法もありそうです。