2016-03-31 12 views
0
私は次のコード持って本当に奇妙な問題が発生してい

与えて比較し8.1:Boardは、ボタンの配列と、bはのWindows Phone Control.Contentが間違った結果

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(); 
    } 
} 

を、持っているcは同じ値の「1」。しかし、ifステートメントでそれらを比較すると、すべてfalseになります。文字列が空かヌルかをチェックする他のステートメントはtrueの値を与えます。

+0

を 'A'、 'B'と 'C'の種類は何ですか? if文の中のキャストから、私はそれらが 'オブジェクト'であると推測しています。つまり、値の等価比較ではなく参照の等価比較をしています。 –

+0

あなたはそうです。オブジェクトです。 Control.textは文字列を返しますが、内容は文字列を返さないようです。コントロールのテキストを比較するにはどうすればよいですか? Content.ToString()を実行する唯一の方法はありますか? – KOPEUE

答えて

1

値の等しい比較の代わりに参照の等価比較を実行しています。あなたのコードは次のように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(); 
    } 
} 

これはa == bObject.ReferenceEquals(a, b)に比較equivelentになり<object> == <object>ではなく<string> == <string>、として解決されていることを意味します。価値の平等を得るためには、ただちにa,bおよびcをキャストする必要があります。今aが文字列であることを、あなたも手動の両方をチェックするのではなく、String.IsNullOrEmptyを使用することができます。

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

これは明らかにオブジェクトであるために動作しませんでした。文字列であるため、ifを '!string.IsNullOrEmpty(a) 'に切り替えることができます。 – KOPEUE

+1

良い点!私はそれを行う答えを編集しました。 –

関連する問題