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

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

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

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

LINQ

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

Q&A

解決済

2回答

438閲覧

Linqの=>の右側の処理に関して。

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

LINQ

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

0グッド

0クリップ

投稿2018/09/08 09:41

前提・実現したいこと

前回の質問では、質問がまとまっておらず、失礼しました。
参考にしているサイトを見ても、
やはりまだLINQのラムダ式の=>の右側の処理が何を書いているのかよくわからないという状態でした。

その原因は、LINQのどのメソッドでもラムダ式の=>の右側の処理に一律に同じことを書けばいいと思い込んでいたのが、
混乱の原因だったのかもしれません。

しかし実際は、LINQのメソッドによって、ラムダ式の=>の右側に書く処理は変わるということでしょうか?

つまり、「FirstOrDefaultやFindやWhereの場合は、=>の右側が1行の場合、=>の右側に要素を取得する為の条件式を書き、
Selectの場合は、=>の右側が1行の場合、=>の右側に取得する要素や、取得する加工した要素を書く」ということで合っていますか?

試したこと

自分なりに解釈したことを下記ソースのコメントに書きました。
合っているかご教示いただけませんか?

また、コメントの質問2についてご教示お願い致します。

C#

1 public partial class Form1 : Form 2 { 3 List<int> list = new List<int> { 1, 2, 3, 4, 5}; 4 5 public Form1() 6 { 7 InitializeComponent(); 8 } 9 10 private void Form1_Load(object sender, EventArgs e) 11 { 12 // 13 //FirstOrDefaultの場合、=>の右側が1行の場合、 14 //=>の右側に要素を取得する為の条件式を書く。 15 // 16 17 int i = list.FirstOrDefault(item => item % 2 == 0); 18 //FirstOrDefaultはSelectと違って、 19 //下記のように=>の右側に取得する要素や、取得する加工した要素を書くことはできない。 20 //int i2 = list.FirstOrDefault(item => item + 100); //エラー。 21 Console.WriteLine(i); //2 22 23 //FirstOrDefaultの書き換えは下記。 24 int i2 = 0; //OrDefaultのときは初期値を返す。 25 26 foreach (int item2 in list) 27 { 28 if(item2 % 2 == 0) 29 { 30 i2 = item2; 31 break; 32 } 33 } 34 35 Console.WriteLine(i2); //2 36 37 // 38 //FindやWhereも=>の右側が1行の場合、 39 //=>の右側に要素を取得する為の条件式を書く。 40 // 41 42 //FindはLinqのメソッドではなく、Listに用意されたメソッド。 43 //Findメソッドも先頭から検索して初めに見つかった要素を返す。 44 int i3 = list.Find(item => item % 2 == 0); 45 Console.WriteLine(i3); //2 46 47 //Whereメソッドは、FirstOrDefaultやFindと違って、 48 //取得する為の条件を満たした全ての要素を取得する。 49 IEnumerable<int> result = list.Where(item => item % 2 == 0); 50 51 52 // 53 //Selectの場合は、=>の右側が1行の場合、 54 //=>の右側に取得する要素や、取得する加工した要素を書く。 55 // 56 57 IEnumerable<int> result2 = list.Select(item => item + 100); 58 //Selectは、FirstOrDefault等と違って、 59 //下記のように=>の右側に要素を取得する為の条件式を書くことはできない。 60 //IEnumerable<int> result3 = list.Select(item => item % 2 == 0); //エラー。 61 foreach(int r in result2) 62 { 63 Console.WriteLine(r); 64 } 65 //101 66 //102 67 //103 68 //104 69 //105 70 71 72 // 73 //質問2:偶数のものだけ+100するという書き方はできませんか? 74 // 75 IEnumerable<int> result3 = list.Select(item => if (item % 2 == 0) { return item + 100}); 76 } 77 }

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

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

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

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

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

guest

回答2

0

ベストアンサー

つまり、「FirstOrDefaultやFindやWhereの場合は、=>の右側が1行の場合、=>の右側に要素を取得する為の条件式を書き、

Selectの場合は、=>の右側が1行の場合、=>の右側に取得する要素や、取得する加工した要素を書く」ということで合っていますか?

リファレンスを参照してください。
FirstOrDefault
Select

ちなみに、

C#

1Func<TSource, TResult> f = i => i+1;

とあった場合

c#

1TResult f(TSource i){ return i+1;}

と同じようなものです。


追記

IEnumerable<int> result3 = list.Select(item => if (item % 2 == 0) { return item + 100});

cs

1var result3 = list.Select(item => item % 2 == 0 ? item + 100 : item);

投稿2018/09/08 13:32

編集2018/09/09 10:32
asm

総合スコア15147

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

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

退会済みユーザー

退会済みユーザー

2018/09/09 03:23

ご回答ありがとうございます。 リファレンスを拝見しましたが、英語の読解に自信がなくて、 合っているようには見えるのですが、いかがでしょうか?
asm

2018/09/09 10:26

読解に自信があろうがなかろうが、C#をやっていくつもりならばMSDNの原文を読み解くのは必須です。 (訳文は機械翻訳の精度が悪く、参考になるかすら微妙です) FirstOrDefaultやFindやWhereには問題ありませんが、Selectに渡す関数は射影(or変形)の式が正しいかなと個人的には思います。
退会済みユーザー

退会済みユーザー

2018/09/09 10:32

ご回答ありがとうございます。 勉強になりました。
guest

0

ただ単に、FirstOrDefaultやSumに便利な省略記法があるだけで、

LINQの基本は、
Select Where GroupBy Order
あたりです。

それぞれ
Select 写像 Map 変形
Where 条件をしていする
GroupBy グループ化をする
Order ソートする

この役割を組み合わせれば、いろいろやれるよ。っていうものです。

質問2:偶数のものだけ+100するという書き方はできませんか?

今は、ローカル関数が使えるので、

 int 偶数の時100足す(int i) { if (item % 2 == 0) { return item + 100; } return item } IEnumerable<int> result3 = list.Select(item => 偶数の時100足す(item));

こういう風に書ける。質問のでは、関数として正しくない。

IEnumerable<int> result3 = list.Select(item => { if (item % 2 == 0) { return item + 100} return item });

わざわざローカル関数を使わなくても、こう書ける。

投稿2018/09/08 10:35

kiichi54321

総合スコア1984

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

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

退会済みユーザー

退会済みユーザー

2018/09/08 11:50

ご回答ありがとうございます。 念の為確認ですが、FirstOrDefaultやFindの省略記法は、 ソースのコメント通り、 「=>の右側には要素を取得する為の条件式を書く」ということで合っていますか? あと、こちら IEnumerable<int> result3 = list.Select(item => { if (item % 2 == 0) { return item + 100} return item }); をコードに貼り付けたのですが、 「CS1002 ; が必要です。」というエラーメッセージが2つ出まして、どう修正すればよいですか?
kiichi54321

2018/09/08 13:01

C#の文法から考えてみてください。returnの後には「;」が必要だわな
asm

2018/09/08 13:07

Aggregateぇ・・・
退会済みユーザー

退会済みユーザー

2018/09/08 13:24

ご回答ありがとうございます。 「;」を2つ書いて検証できました。 FirstOrDefaultの省略記法が説明している所を見たのですが、 よくわからなかったのですが、 https://msdn.microsoft.com/ja-jp/library/bb340482(v=vs.110).aspx FirstOrDefaultやFindの省略記法は、 ソースのコメント通り、 「=>の右側には要素を取得する為の条件式を書く」ということで合っていますか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問