1. ホーム
  2. c#

[解決済み】なぜこのコードはInvalidOperationExceptionを投げるのですか?

2022-02-08 11:28:39

質問

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

解決方法は?

ご覧の通り ここで は、その First メソッドは InvalidOperationException は、この関数が呼ばれたシーケンスが空であったときに呼び出されます。 分割の結果,どの要素も Hello5 となり、結果は空リストとなります。 使用方法 First を実行すると、例外が発生します。

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

を使用した方がまだきれいかもしれません。 Any Linqメソッド(ドキュメント ここで を返します。 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#ではより慣用的な方法と考えられています。