パート 1 では、これを行うことができます。
var has4ofaKind = cards.GroupBy(c => c.Name).Any(g => g.Count() >= 4);
Value
パート 2では、文字列ではなく整数などのプロパティがあれば、はるかに簡単になります。次に、これを行うことができます:
var firstSuit = cards.First.Suit();
var isFlush = cards.Skip(1).All(c => c.Suit == firstSuit);
var isStraight = !cards.OrderBy(c => c.Value)
.Select((c, i) => c.Value - i)
.Distinct().Skip(1).Any();
var isStraightFlush = isFlush && isStraight;
これはハンドが 5 枚のカードであると仮定していることに注意してください。8 枚のハンドで 5 枚のカードのストレート / フラッシュを見つけるには、次のようなものを使用する必要があります。
var hasFlush = cards.cards.GroupBy(c => c.Suit).Any(g => g.Count() >= 5);
var hasStraight = !cards.OrderBy(c => c.Value)
.Select((c, i) => c.Value - i)
.GroupBy(x => x)
.Any(g => g.Count() >= 5);
ストレート フラッシュを見つけるのは少しトリッキーです。
var hasStraightFlush= !cards.OrderBy(c => c.Value)
.Select((c, i) => new { x = c.Value - i, c.Suit })
.GroupBy(x => x)
.Any(g => g.Count() >= 5);