質問のタイトルがうまくできていないことをお詫びします。うまくいけば、いくつかのコードで明らかになるでしょう
次のようにポーカーハンド情報を格納するクラスを作成しました
public class BestHandSummary<T>
{
public Func<T, bool> Test { get; set; }
public Ranking Rank { get; set; } //Enum: Nothing, TwoPair, Straight, Flush, Poker :in ascending order
public int BestCard { get; set; }
public BestHand(Ranking r)
{
Rank = r;
}
..//default ctor
}
一致したルールの First() を取得すると、最も強力なハンドがベスト ハンドとして選択されるように、最も価値のあるハンドの順にルール コレクションを初期化しました。
rules = new List<BestHandSummary<PokerHand>>()
{
new BestHandSummary<PokerHand> { Test = h => h.HandContainsFourOfAKind(out bestCard),
Rank = Ranking.FourOfAKind,
BestCard = bestCard },
new BestHandSummary<PokerHand> { Test = h => h.HandContainsFlush(),
Rank = Ranking.Flush },
new BestHandSummary<PokerHand> { Test = h => h.HandContainsStraight(out bestCard),
Rank = Ranking.Straight,
BestCard = bestCard },
new BestHandSummary<PokerHand> { Test = h => h.HandContainsTwoPair(out bestCard),
Rank = Ranking.Straight,
BestCard = bestCard },
};
private BestHandSummary<PokerHand> GetAPlayersBestHand(PokerHand hand)
{
bool hasAny = rules.Any(r => r.Test(hand));
if (hasAny)
{
return rules.Where(r => r.Test(hand) == true).First();
}
return new BestHandSummary<PokerHand>(Ranking.Nothing);
}
私が理解できないように見えるのは、out param bestCard を BestHandSummary クラスの BestCard プロパティにトンネルする方法です。上記のコードは機能しません。BestCard = bestCard が割り当てられません。その理由は理解できますが、修正するために小さな変更を加えることができるかどうか疑問に思っています..