私のコードは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
}
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#ではより慣用的と見なされています。
これを試してください:
bool hasMatch = str.Split(',').Any(x => x.Equals(another));
ViewBag.test = hasMatch ? "Match" : "No Match";