2016-12-12 8 views
0

Ich frage mich, ob ich hier Hilfe bekommen könnte. Ich habe einen Code, der 2 Zahlenpaare erzeugt. Ich vergleiche sie mit dem .except. Die Frage, die ich habe, ist, anstatt die Zahlen wie in meinem Code gezeigt zuzuweisen, wie ich 50 zufällige Würfe zu den Paaren zum Vergleich hinzufügen.Zufügen von Zufallszahlen zum Vergleichen von Listen zum Vergleichen

public FrmDieRoller() 
    { 
     InitializeComponent(); 
    } 

    public class Pair 
    { 
     public int FirstDie { get; set; } 
     public int SecondDie { get; set; } 
    } 

    public class Pair2 
    { 
     public int ThirdDie { get; set; } 
     public int FourthDie { get; set; } 

    } 

    public static List<Pair> ConvertToPairs(int[,] dieValues) 
    { 
     var query = from int item in dieValues select item; 
     var p1Rolls = query.ToList(); 
     List<Pair> pairs = new List<Pair>(p1Rolls.Count); 
     for (int i = 0; i <4 ; i += 2) 
     { 
      pairs.Add(new Pair() {FirstDie = p1Rolls[i], SecondDie = 
      p1Rolls[i+ 1]}); 
     } 
     return pairs; 
    } 

    public static List<Pair2> ConvertToPairs2(int[,] dieValues1) 
    { 
     var query = from int item1 in dieValues1 select item1; 
     var p2Rolls = query.ToList(); 
     List<Pair2> pairs1 = new List<Pair2>(p2Rolls.Count); 
     for (int j = 0; j < 4; j += 2) 
     { 
      pairs1.Add(new Pair2() {ThirdDie = p2Rolls[j], FourthDie = 
      p2Rolls[j + 1]}); 
     } 
     return pairs1; 
    } 

    public void btnRoll_Click(object sender, EventArgs e) 
    { 

     int[,] dieValue1 = {{1,2},{3,4}}; 
     int[,] dieValue2 = {{2,6},{5,1}}; 



     var p1Rolls = ConvertToPairs(dieValue1); 
     var p2Rolls = ConvertToPairs(dieValue2); 

     foreach (var item in p1Rolls.Except(p2Rolls)) 
     { 

     lstRollDifference.Items.Add(string.Format("Player one has [{0}, 

     {1}] which Player two does not", item.FirstDie, item.SecondDie)); 


     } 
+0

Ihr Code wird nicht funktionieren. Sie können 'Except' nicht für Objekte aufrufen, die' GetHashCode' und 'Equals' nicht überschreiben. – Enigmativity

+0

Wenn Sie mit diesem Code versuchen - 'int [,] dieValue1 = {{1, 2}, {3, 4}}; int [,] dieValue2 = {{2, 6}, {5, 1}, {3, 4}}; "- Sie werden sehen, dass Sie immer noch erfahren, dass" "Spieler 1 [3, 4] welchen Spieler hat zwei nicht "'. – Enigmativity

+0

Ich entschuldige mich ich bin noch neu zu C# Könnten Sie bitte ein wenig mehr über den gethashcode und außer –

Antwort

0

Dies ist, wie ich bei der Erstellung der zufälligen Rollen aussehen:

private Random _random = new Random(); 

private int RollDie() 
{ 
    return _random.Next(1, 7); // 7 is the exclusive max value - so real max is 6 
} 

private Pair RollPair() 
{ 
    return new Pair() 
    { 
     FirstDie = this.RollDie(), 
     SecondDie = this.RollDie() 
    }; 
} 

public void btnRoll_Click(object sender, EventArgs e) 
{ 
    List<Pair> p1Rolls = Enumerable.Range(0, 50).Select(n => this.RollPair()).ToList(); 
    List<Pair> p2Rolls = Enumerable.Range(0, 50).Select(n => this.RollPair()).ToList(); 

    foreach (var item in p1Rolls.Except(p2Rolls)) 
    { 
     lstRollDifference.Items.Add(string.Format("Player one has [{0}, {1}] which Player two does not", item.FirstDie, item.SecondDie)); 
    } 
} 
0

Sie können die Random Klasse verwenden Rollen zu erzeugen, und es wäre am einfachsten, dass Code in der Pair Klasse zu übernehmen als gezeigt:

class Pair : IEquatable<Pair> 
{ 
    public int FirstDie { get; set; } 
    public int SecondDie { get; set; } 

    public Pair(int d1, int d2) 
    { 
     FirstDie = d1; 
     SecondDie = d2; 
    } 

    public bool Equals(Pair other) 
    { 
     return this.FirstDie.Equals(other.FirstDie) 
      && this.SecondDie.Equals(other.SecondDie); 
    } 

    public override int GetHashCode() 
    { 
     return FirstDie.GetHashCode() 
       ^SecondDie.GetHashCode(); 
    } 

    private static Random r = new Random(); 
    public static Pair RollNewPair() 
    { 
     // The minimum value is inclusive, the maximum value is exclusive 
     return new Pair(r.Next(1, 7), r.Next(1, 7)); 
    } 
} 

(Wie Enigmativity sagte, wird die Except Methode nicht richtig funktionieren, ohne die Umsetzung IEquatable<Pair> und overridin g GetHashCode)

Und es dann wie so benutzen.

int numOfRolls = 20; 

List<Pair> playerOneRolls = Enumerable.Range(0, numOfRolls).Select(n => Pair.RollNewPair()).ToList(); 
List<Pair> playerTwoRolls = Enumerable.Range(0, numOfRolls).Select(n => Pair.RollNewPair()).ToList(); 

foreach (var roll in playerOneRolls.Except(playerTwoRolls)) 
{ 
    // do whatever 
} 
Verwandte Themen