2016-03-31 7 views
0

Ich bin ein wirklich seltsam Problem auftritt ich das folgende Stück Code haben:Windows Phone 8.1 Vergleich Control.Content falsches Ergebnis geben

for (int i = 0; i < Board.Length - 2; i++) 
{ 
    var a = Board[i].Content; 
    var b = Board[i + 1].Content; 
    var c = Board[i + 2].Content; 
    if (a == b && a == c && 
     (string) a != string.Empty && a != null) 
    { 
     MessageDialog msd = new MessageDialog("test"); 
     await msd.ShowAsync(); 
    } 
} 

Wo Board eine Reihe von Tasten ist und a, b, c haben der gleiche Wert von "1". Wenn sie jedoch in der if-Anweisung verglichen werden, geben sie alle falsch an? Die anderen Anweisungen, bei denen ich überprüfe, ob die Zeichenfolge leer ist oder null, geben den Wert wahr an.

+0

Was sind die Arten von 'a', 'b' und 'c'? Von der Besetzung innerhalb der if-Anweisung, ich vermute, sie sind 'Objekte', was bedeutet, dass Sie einen Vergleich der Referenzgleichheit statt Gleichheit Vergleich –

+0

Sie haben Recht .. sie sind Objekte Ich dachte, dass es funktioniert wie Windows-Formulare zu nehmen Der Control.text führt zu einer Zeichenfolge, der Inhalt scheint jedoch keine Zeichenfolge zurückzugeben. Wie kann ich Text von Kontrollen vergleichen? Ist 'Content.ToString()' die einzige Möglichkeit? – KOPEUE

Antwort

1

Sie führen einen Vergleich der Referenzgleichheit anstelle eines Vergleichs der Wertgleichheit durch. Der Code wird auf die folgende equivelent:

for (int i = 0; i < Board.Length - 2; i++) 
{ 
    object a = Board[i].Content; 
    object b = Board[i + 1].Content; 
    object c = Board[i + 2].Content; 
    if (a == b && a == c && 
     (string) a != string.Empty && a != null) 
    { 
     MessageDialog msd = new MessageDialog("test"); 
     await msd.ShowAsync(); 
    } 
} 

Das bedeutet, dass a == b als <object> == <object> aufgelöst wird, anstatt <string> == <string>, was zu Object.ReferenceEquals(a, b) in einem Vergleich equivelent führt. Um die Wertgleichheit zu erhalten, sollten Sie sofort a, b und c umwandeln. Nun, da a ein String ist, können Sie auch String.IsNullOrEmpty anstelle von manuell beide Überprüfung:

for (int i = 0; i < Board.Length - 2; i++) 
{ 
    string a = (string)Board[i].Content; 
    string b = (string)Board[i + 1].Content; 
    string c = (string)Board[i + 2].Content; 
    if (a == b && a == c && !String.IsNullOrEmpty(a)) 
    { 
     MessageDialog msd = new MessageDialog("test"); 
     await msd.ShowAsync(); 
    } 
} 
+1

Es hat offensichtlich vorher nicht funktioniert, weil sie Objekte waren, jetzt, da es sich um Strings handelt, können Sie das If zu '! String.IsNullOrEmpty (a)' – KOPEUE

+1

Guter Punkt! Ich habe die Antwort bearbeitet, um das zu tun. –

Verwandte Themen