C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

C#のラムダ式について /C#初心者 (21/08/21(Sat) 09:11) #98000
Re[1]: C#のラムダ式について /WebSurfer (21/08/21(Sat) 09:58) #98001
Re[1]: C#のラムダ式について /とっちゃん (21/08/21(Sat) 14:35) #98002
Re[1]: C#のラムダ式について /古谷 (21/08/21(Sat) 19:51) #98003
  └ Re[2]: C#のラムダ式について /WebSurfer (21/08/21(Sat) 20:34) #98004
    └ Re[3]: C#のラムダ式について /WebSurfer (21/08/22(Sun) 11:22) #98005


親記事 / ▼[ 98001 ] ▼[ 98002 ] ▼[ 98003 ]
■98000 / 親階層)  C#のラムダ式について
□投稿者/ C#初心者 (2回)-(2021/08/21(Sat) 09:11:42)

分類:[.NET 全般] 

ラムダ式ってなんですか?
デリゲート型の引数(Func<>)に代入するメソッドを定義するためだけの演算子ですか?
「その場で定義」することの上記以外の意味をあまりよく理解できていないので活用場面などを噛み砕いて教えて下さい
[ □ Tree ] 返信 編集キー/

▲[ 98000 ] / 返信無し
■98001 / 1階層)  Re[1]: C#のラムダ式について
□投稿者/ WebSurfer (2330回)-(2021/08/21(Sat) 09:58:04)
No98000 (C#初心者 さん) に返信
> ラムダ式ってなんですか?
> デリゲート型の引数(Func<>)に代入するメソッドを定義するためだけの演算子ですか?
> 「その場で定義」することの上記以外の意味をあまりよく理解できていないので活用場面などを噛み砕いて教えて下さい

一から十まで手取り足取りここのような掲示板で説明してもらえると思うのは
期待しすぎでは?

他の Q&A サイトのものですが参考になるので一度読んでみてください。

質問するときのヒント
https://teratail.com/help/question-tips

特に以下のあたり:

1-2: 投稿前に検索し、できるところまで自分でやってみましょう

2. 質問をする前に自分で何がわからないのかを把握しましょう

そこにも書いてありますが、「何がわからないかわからない人から質問を受けても、
答える側も困ってしまいます」という状況です。
[ 親 98000 / □ Tree ] 返信 編集キー/

▲[ 98000 ] / 返信無し
■98002 / 1階層)  Re[1]: C#のラムダ式について
□投稿者/ とっちゃん (736回)-(2021/08/21(Sat) 14:35:10)
No98000 (C#初心者 さん) に返信
> ラムダ式ってなんですか?
> デリゲート型の引数(Func<>)に代入するメソッドを定義するためだけの演算子ですか?
> 「その場で定義」することの上記以外の意味をあまりよく理解できていないので活用場面などを噛み砕いて教えて下さい

かみ砕いてとなると前提条件のすり合わせからしないといけないので、掲示板ではなかなか難しいので
いくつか紹介しておきます。

C# でググれな人のページから…

・ラムダ式 - C# によるプログラミング入門
https://ufcpp.net/study/csharp/sp3_lambda.html

それなりにボリュームのあるページですが、個人的にはわかりやすくまとまってると思います。
とはいえ、わかりやすさは人によるので、難しいと感じる人もいるだろうし、言い回しの好みなどもあると思います。

ってことで、一応公式(C#ですが…)も貼っておきます。

・ラムダ式 (C# リファレンス)
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/lambda-expressions?WT.mc_id=DT-MVP-32182

[ 親 98000 / □ Tree ] 返信 編集キー/

▲[ 98000 ] / ▼[ 98004 ]
■98003 / 1階層)  Re[1]: C#のラムダ式について
□投稿者/ 古谷 (7回)-(2021/08/21(Sat) 19:51:27)
ラムダ式は関数を簡単に書けるもので
ラムダ式のメリットは簡単な処理を簡単に書けること、これに尽きる

簡単な処理を組み合わせるとたいていの処理はできる
処理を組み合わせる仕組みがLINQ

マイクロソフトはLINQのためにラムダ式と拡張メソッドを.NETに追加したという
ドキュメントをMSDNで見た覚えがあるんだけど、もう見つけられない

実際にプログラム書いてみるとラムダ式のありがたみがわかる

たとえば、次のように
クラス名:名前:点数
のデータがあったとして

Bクラス:中川:50
Aクラス:山田:40
Bクラス:川上:70
Aクラス:田中:30
Cクラス:村山:40
Cクラス:上村:20

各クラスごとの最高得点を求めて次のようにクラス名順に出力してください

Aクラス:40
Bクラス:70
Cクラス:40

という問題があったときラムダ式を使うと次のように書ける
https://paiza.io/projects/AeCjQQNRb5UJgsG_bcHcQg

ラムダ式使わなかったら結構プログラム書かないといけない
あると超便利、それがラムダ式


[ 親 98000 / □ Tree ] 返信 編集キー/

▲[ 98003 ] / ▼[ 98005 ]
■98004 / 2階層)  Re[2]: C#のラムダ式について
□投稿者/ WebSurfer (2331回)-(2021/08/21(Sat) 20:34:04)
No98003 (古谷 さん) に返信

> という問題があったときラムダ式を使うと次のように書ける
> https://paiza.io/projects/AeCjQQNRb5UJgsG_bcHcQg

それはラムダ式というより Linq のメソッド構文ではないのですか? 
クエリ構文で書くとどうなるでしょうか?
[ 親 98000 / □ Tree ] 返信 編集キー/

▲[ 98004 ] / 返信無し
■98005 / 3階層)  Re[3]: C#のラムダ式について
□投稿者/ WebSurfer (2332回)-(2021/08/22(Sun) 11:22:52)
No98004 で「クエリ構文で書くとどうなるでしょうか?」と書いたのですが、自分でやってみました。
もっとスマートに書く方法はあるでしょうか?

出題が Linq のメソッド式や Tuple を使って回答するように書かれたもののようですが、何にせよ
クエリ構文でかつラムダ式を使わないで書くというのはちょっと無理やり感があって、ラムダ式が
便利なのは確かだと思います。


using System;
using System.Linq;

namespace ConsoleApp4
{
    class Program
    {
        static void Main(string[] args)
        {
            var data = new string[] {
                "Bクラス:中川:50",
                "Aクラス:山田:40",
                "Bクラス:川上:70",
                "Aクラス:田中:30",
                "Cクラス:村山:40",
                "Cクラス:上村:20"
            };

            var xs = data
                .Select(x => x.Split(':'))
                .GroupBy(x => x[0])
                .Select(x => Tuple.Create(x.Key, x.Max(y => Int32.Parse(y[2]))))
                .OrderBy(x => x.Item1);

            foreach (var x in xs)
            {
                Console.WriteLine(x);
            }

            Console.WriteLine("----------------------------");

            var list = from d in data
                       select new
                       {
                           ItemArray = d.Split(':')
                       };

            var result = from i in list
                         group i by i.ItemArray[0] into g
                         orderby g.Key
                         select new
                         {
                             Class = g.Key,
                             HighScore = (from i2 in g select int.Parse(i2.ItemArray[2])).Max()
                         };

            foreach (var item in result)
            {
                Console.WriteLine($"{item.Class}, {item.HighScore}");
            }
        }
    }
}


実行結果は:

(Aクラス, 40)
(Bクラス, 70)
(Cクラス, 40)
----------------------------
Aクラス, 40
Bクラス, 70
Cクラス, 40

[ 親 98000 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -