初めてのLinq
Linqがちょっとわかってきた(と思う)。
using System; using System.Linq; using System.Collections.Generic; namespace Query1 { static class Program { struct N { public int a, b, c; } static void Main(string[] args) { List<N> list = new List<N> { new N { a = 1, b = 1, c = 1 }, new N { a = 1, b = 2, c = 2 }, new N { a = 3, b = 3, c = 0 }, new N { a = 2, b = 4, c = 6 }, new N { a = 2, b = 5, c = 3 }, new N { a = 1, b = 2, c = 4 }, new N { a = 1, b = 1, c = 3 }, new N { a = 3, b = 2, c = 2 }, new N { a = 2, b = 4, c = 9 }, }; Console.Write("a=1の時,"); foreach (var v in from i in list where i.a == 1 orderby i.b, i.c select i) { Console.Write("(b={0},c={1})", v.b, v.c); } Console.WriteLine(); Console.Write("a=2の時,"); foreach (var v in from i in list where i.a == 2 orderby i.b, i.c select new { i.b, i.c }) { Console.Write("(b={0},c={1})", v.b, v.c); } Console.WriteLine(); Console.Write("a=3の時,"); foreach (var v in list .Where(x => x.a == 3) .OrderBy(x => x.b) .ThenBy(x => x.c) .Select(x => new { x.b, x.c })) { Console.Write("(b={0},c={1})", v.b, v.c); } Console.WriteLine(); Console.WriteLine(); foreach (var v in from i in list orderby i.a group i.b by i.a) { Console.WriteLine("a={0}の時,bの合計={1}", v.Key, v.Sum()); } Console.WriteLine(); foreach (var v in from i in list orderby i.a group i.b by i.a into j select new { j.Key, sumB = j.Sum() }) { Console.WriteLine("a={0}の時,bの合計={1}", v.Key, v.sumB); } Console.WriteLine(); foreach (var v in from i in list orderby i.a group new { i.b, i.c } by i.a) { Console.WriteLine("a={0}の時,bの合計={1},cの合計={2}", v.Key, v.Sum(w => w.b), v.Sum(w => w.c)); } Console.WriteLine(); foreach (var v in from i in list orderby i.a group new { i.b, i.c } by i.a into j select new { A = j.Key, sumB = j.Sum(k => k.b), sumC = j.Sum(k => k.c) }) { Console.WriteLine("a={0}の時,bの合計={1},cの合計={2}", v.A, v.sumB, v.sumC); } Console.WriteLine(); foreach (var v in from i in list orderby i.a group i by i.a) { Console.Write("a={0}の時,", v.Key); foreach (var w in from i in v orderby i.b, i.c select i) { Console.Write("(b={0},c={1})", w.b, w.c); } Console.WriteLine(); } Console.WriteLine(); Console.WriteLine("Hit any key."); Console.ReadLine(); } } }
↓意図したとおりに出力された。結構おもしろい。
a=1の時,(b=1,c=1)(b=1,c=3)(b=2,c=2)(b=2,c=4) a=2の時,(b=4,c=6)(b=4,c=9)(b=5,c=3) a=3の時,(b=2,c=2)(b=3,c=0) a=1の時,bの合計=6 a=2の時,bの合計=13 a=3の時,bの合計=5 a=1の時,bの合計=6 a=2の時,bの合計=13 a=3の時,bの合計=5 a=1の時,bの合計=6,cの合計=10 a=2の時,bの合計=13,cの合計=18 a=3の時,bの合計=5,cの合計=2 a=1の時,bの合計=6,cの合計=10 a=2の時,bの合計=13,cの合計=18 a=3の時,bの合計=5,cの合計=2 a=1の時,(b=1,c=1)(b=1,c=3)(b=2,c=2)(b=2,c=4) a=2の時,(b=4,c=6)(b=4,c=9)(b=5,c=3) a=3の時,(b=2,c=2)(b=3,c=0) Hit any key.