ケブンッリジ関数 を C# で

ゲンゾウ用ポストイット: ケブンッリジ関数 どう書く?org に影響されて実装してみた。

using System;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace Cmabridge
{
  class Program
  {
    static Random random = new Random();
    static void Main(string[] args)
    {
      var s = @"こんにちは みなさん おげんき ですか? わたしは げんき です。
この ぶんしょう は いぎりす の ケンブリッジ だいがく の けんきゅう の けっか
にんげん は もじ を にんしき する とき その さしいょ と さいご の もじさえ あっていれば
じゅんばん は めちゃくちゃ でも ちゃんと よめる という けんきゅう に もとづいて
わざと もじの じゅんばん を いれかえて あります。
どうです? ちゃんと よめちゃう でしょ?
ちゃんと よめたら はんのう よろしく";
      Console.WriteLine(Cmavridge(s));
      Console.ReadKey();
    }
    private static string Cmavridge(string s)
    {
      var buf = new StringBuilder();
      var r = new Regex(@"(?<prefix>(^|\s+)[^\s])((?<shuffle>[^\s]+)?(?<suffix>[^\s]))?(?=(\s+|$))");
      foreach (Match m in r.Matches(s))
      {
        buf.AppendFormat("{0}{1}{2}", 
          m.Groups["prefix"].Value, 
          Shuffle(m.Groups["shuffle"].Value), 
          m.Groups["suffix"].Value);
      }
      return buf.ToString();
    }
    private static string Shuffle(string s)
    {
      return new string(s.ToCharArray().OrderBy(m => random.NextDouble()).ToArray());
    }
  }
}

どう書く?org 見てみたけど、JavaC# はどうしてもコードが多くなるね。Groovy や Ruby はソースが短い!