かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

成績表のソート

前に「成績表のノート - かずきのBlog@Hatena」でやった問題をC#3.0で書き直してみた。
こういう、問題こそLINQの出番でしょ!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ScoreSort
{
    class Program
    {
        static void Main(string[] args)
        {
            // 学籍番号と得点(成績)の組:
            // record      (7, 345), (8, 678), (1, 123), ...
            // 
            // それと学籍番号の列:
            // target      { 4, 5, 3, 1, 2 };
            // 
            // があるとき、targetを得点順にソートせよ。
            var records = new[]{
                                new[] {7, 345},
                                new[] {8, 678},
                                new[] {1, 123},
                                new[] {2, 456},
                                new[] {5, 567},
                                new[] {6, 812},
                                new[] {3, 781},
                                new[] {4, 234}
                         };
            var target = new[] { 4, 5, 3, 1, 2 };

            var sortedTarget = from num in target
                               join record in records on num equals record[0]
                               orderby record[1]
                               select new { Number = num, Score = record[1] };
            foreach (var num in sortedTarget)
            {
                Console.WriteLine(num);
            }
        }
    }
}

実行結果↓

{ Number = 1, Score = 123 }
{ Number = 4, Score = 234 }
{ Number = 2, Score = 456 }
{ Number = 5, Score = 567 }
{ Number = 3, Score = 781 }

問い合わせ言語様々。