シャッフルする拡張メソッド

元ネタ:

コード
public static class StringArrayShuffleEx
{
  public static string[] Shuffle(this string[] source)
  {
    var sourceList = new List<string>(source);
    var shuffledList = new List<string>();

    var random = new Random(DateTime.Now.Millisecond);

    while ( true )
    {
      // 1枚抜き取って
      var item = sourceList[random.Next(sourceList.Count)];

      // 新しいとこに移動
      shuffledList.Add(item);
      sourceList.Remove(item);

      // 元の山が無くなったら終わり
      if ( sourceList.Count == 0 )
      {
        break;
      }
    }

    return shuffledList.ToArray<string>();
  }
}
class Program
{
  static void Main(string[] args)
  {
    string[] cards =
    {
      "SA", "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9", "S10", "SJ", "SQ", "SK",
      "HA", "H2", "H3", "H4", "H5", "H6", "H7", "H8", "H9", "H10", "HJ", "HQ", "HK",
      "DA", "D2", "D3", "D4", "D5", "D6", "D7", "D8", "D9", "D10", "DJ", "DQ", "DK",
      "CA", "C2", "C3", "C4", "C5", "C6", "C7", "C8", "C9", "C10", "CJ", "CQ", "CK",
      "Joker"
    };

    Console.WriteLine("■シャッフル前");
    foreach ( var card in cards )
    {
      Console.WriteLine(card);        
    }

    Console.WriteLine("");

    var shuffledCards = cards.Shuffle();

    Console.WriteLine("■シャッフル後");
    foreach ( var card in shuffledCards )
    {
      Console.WriteLine(card);
    }

    Console.ReadKey();
  }
}
実行結果
■シャッフル前
SA
S2
S3
S4
S5
S6
S7
S8
S9
S10
SJ
SQ
SK
HA
H2
H3
H4
H5
H6
H7
H8
H9
H10
HJ
HQ
HK
DA
D2
D3
D4
D5
D6
D7
D8
D9
D10
DJ
DQ
DK
CA
C2
C3
C4
C5
C6
C7
C8
C9
C10
CJ
CQ
CK
Joker

■シャッフル後
C4
D3
D5
D6
H10
HJ
C5
S5
DK
S7
SK
DJ
S4
H8
C3
D4
HK
S3
H4
H5
D8
HA
H3
C8
S8
HQ
CK
H7
H6
D10
D2
C2
Joker
CA
S10
H9
S6
CQ
C9
DQ
C10
S2
S9
D9
C6
SQ
SA
CJ
H2
DA
C7
SJ
D7

ちゃんとシャッフルできてるね♪

#後でわんくまにも転記。