LINQ サンプル

最近、暇を見てちょっとづつ大富豪をC#で作ってたりする。
改めて思うけど、LINQ to Object は便利だ。

[0, max) の範囲の数字をシャッフル
Random rnd = new Random();

Enumerable.Range(0, max)
  .OrderBy(x => rnd.Next());
イテレーターeをN分の1程度にランダムに間引く
e.Where(x => rnd.Next() < int.MaxValue / N);
同ランクのカードの判定

(ジョーカーはワイルドカード扱い。)

static bool IsSameRank(IEnumerable<Card> cards)
{
  return cards
    .Where(x => x.Suit != Suit.Joker)
    .Select(x => x.Rank)
    .Distinct()
    .Count() <= 1;
}
同スイートカードの判定

(ジョーカー無視。)

public static bool IsSameSuit(IEnumerable<Card> cards)
{
  return cards.Select(x => x.Suit).Distinct().Count() == 1;
}
同スイート連番判定

(ジョーカー無視。)

bool IsSequence(IEnumerable<Card> cards)
{
  if (!IsSameSuit(cards))
    return false;

  // ランクでソート済みにする。
  var ranks = cards
    .Select(c => Rank(c)) // Rank() は大富豪的ランク(2が最強)に変換
    .OrderBy(r => r);

  // ranks の階差が全部1になっているかどうか判定
  // 実際に書いたコードはワイルドカードにも対応していて、結構長めなので割愛。
}