1

これは初心者の質問であることは知っていますが、とにかく助けていただければ幸いです...

私がサイコロを持っているとします

public class Dice
{
   public int FaceValue { get; set; }
   public Dice(int faceValue)
   {
      this.FaceValue = faceValue; 
   }
}

そして結果クラス...

public class Result
{

   public Dice D1 { get; set; }
   public Dice D2 { get; set; }
   public Dice D3 { get; set; }

   // Always has three dices ...
   public Result(Dice d1,Dice d2,Dice d3)
   {
      D1 = d1;
      D2 = d2;
      D3 = d3; 
   }
}

そしてクラスベット...

public class Bet
{
   // A bet could have one , two , or three dices ....
   public List<Dice> Dices = new List<Dice>();
}

単一のベット (1、2、または 3 つのサイコロを持つことができる) をカウントする非常に簡単な方法 (LINQ かどうか) はありますか?

常に 3 つのサイコロを持つ 1 つの結果に表示されますか?

ベットのリストに複数のベットがある場合、3 つのサイコロの結果にベットが表示されるかどうかを確認しますか?

例えば

Result.D1 = new Dice(1);
Result.D2 = new Dice(4);
Result.D3 = new Dice(1);

{ { new Dice(1), new Dice(4) } } appears 1 time ===> 1

{ { new Dice(1) } } appears 2 times ====> 2

{ { new Dice(4) , new Dice(1) , new Dice(1) } } appears 1 time ====> 1

{ { new Dice(5) , new Dice(2) , new Dice(3) } } doesn't appear ====> 0

{ { new Dice(1) , new Dice(6) , new Dice(6) },
{ new Dice(4) , new Dice(4) , new Dice(4) },
{ new Dice(1) , new Dice(2) , new Dice(3) },
{ new Dice(1) , new Dice(5) , new Dice(5) },
{ new Dice(1) , new Dice(1) , new Dice(4) },
{ new Dice(3) , new Dice(3) , new Dice(3) } } has one bet that is equal so ========> 1
4

3 に答える 3

1
public class Result
{

   public Dice D1 { get; set; }
   public Dice D2 { get; set; }
   public Dice D3 { get; set; }

   // Always has three dices ...
   public Result(Dice d1,Dice d2,Dice d3)
   {
      D1 = d1;
      D2 = d2;
      D3 = d3; 
   }

   public bool Match(IEnumerable<Dice> dice)
   {
        return ...; // Your comparison logic here
   }
}

var bets = new List<Bet>();

foreach(var bet in bets)
{
    var matchCount = bet.Count(x => Result.Match(x.Dices));
}
于 2013-09-07T15:47:18.947 に答える
1
var dice = ShortForm(new[]{result.D1, result.D2, result.D3});
var betGoodCount = bets.Count(bet => BetInDice(bet, dice));


Dictionary<int, int> ShortForm(IEnumerable<Dice> dice)
{
   return dice
      .GroupBy(die => die.FaceValue)
      .ToDictionary(group => group.Key, group => group.Count);
}
bool BetInDice(Bet bet, Dictionary<int, int> dice)
{
  return ShortForm(bet.Dice)
    .All(pair => dice.ContainsKey(pair.Key) && pair.Value <= dice[pair.Key];
}
于 2013-09-07T18:45:47.450 に答える
0

私はあなたxがサイコロの数を転がしy、賭けの数を配置すると仮定しています。次に、ベットがロールされた数字であるかどうかを比較します。

Betまず、クラスの構造を変更する必要があります。

public class Bet
{
    public int FaceValue { get; set; }
}

その理由は、人は人betに関係しているからface valueです。次に、次のような賭けのリストが表示されます。

List<Bet> bets = new List<Bet>()
{
    new Bet() { FaceValue = 2 },
    new Bet() { FaceValue = 4 },
    //etc
};

Resultこれらのメソッドをクラスに追加します。

private IEnumerable<int> CorrectBets(List<Dice> dice, List<Bet> bets)
{
    //use an linq join on their face values
    return from die in dice
           join bet in bets on die.FaceValue equals bet.FaceValue
           select die.FaceValue;
}

public int NumberOfCorrectBets(List<Bet> bets)
{
    var dice = new List<Dice>() { D1, D2, D3 };
    return CorrectBets(dice, bets).Count(); //this actually gets the count
}

List<Bet>あとは、オブジェクトを作成してNumberOfCorrectBetsメソッドに渡すだけです。

これは、サイコロの数/ベット数の重複を考慮に入れる必要があります。3つまり、aに賭けて a3が 2 回出た場合、答えとして 2 が得られます。

于 2013-09-07T16:15:20.877 に答える