|
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
|