web-dev-qa-db-ja.com

このコードがInvalidOperationExceptionをスローするのはなぜですか?

私のコードは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
}
8
user2398766

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

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

Anyを返すbool Linqメソッド(ドキュメント here )を使用する方がまだきれいかもしれません。

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
}

そして 項演算子 を使用する必須の1つのライナー:

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

ここで==を使用して文字列を比較したことにも注意してください。これはC#ではより慣用的と見なされています。

13
Ben Reich

これを試してください:

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

ViewBag.test = hasMatch ? "Match" : "No Match";
2