初めての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.