10

私のコードはViewBag.testプロパティを に等しくする必要があると思います"No Match"が、代わりにInvalidOperationException.

どうしてこれなの?

string str = "Hello1,Hello,Hello2";
string another = "Hello5";
string retVal = str.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)
                   .First(p => p.Equals(another));
if (str == another)
{
   ViewBag.test = "Match";
}
else
{
   ViewBag.test = "No Match"; //this does not happen when it should
}
4

2 に答える 2

16

ここでわかるように、メソッドが呼び出されたシーケンスが空Firstの場合、メソッドは をスローします。InvalidOperationException分割の結果には と等しい要素がないためHello5、結果は空のリストになります。Firstそのリストで使用すると、例外がスローされます。

シーケンスが空の場合に例外をスローする代わりに、列挙型の型のデフォルト値を返す代わりに ,を使用することを検討してください(ここFirstOrDefaultに文書化されています)。その場合、呼び出しの結果は になり、コードの残りの部分でそれを確認する必要があります。null

を返すAnyLinq メソッド (ここに文書化されています)を使用する方が、よりクリーンな場合がありますbool

string str = "Hello1,Hello,Hello2";
string another = "Hello5";
bool retVal = str.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)
                   .Any(p => p.Equals(another));
if (retVal)
{
   ViewBag.test = "Match";
}
else
{
   ViewBag.test = "No Match"; //not work
}

そして今、三項演算子を使用した必須のワンライナー:

string str = "Hello1,Hello,Hello2";
string another = "Hello5";
ViewBag.test = str.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)
                   .Any(p => p == another) ? "Match" : "No Match";

==ここでは文字列を比較するため にも使用していることに注意してください。これは、C# ではより慣用的であると考えられています。

于 2013-05-19T15:53:45.090 に答える
2

これを試してみてください:

bool hasMatch = str.Split(',').Any(x => x.Equals(another));

ViewBag.test = hasMatch ? "Match" : "No Match";
于 2013-05-19T16:02:41.173 に答える