为什么此代码抛出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
}
正如你在这里看到的,当它被调用的序列是空的时, 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#中被认为更加惯用。
给这个镜头:
bool hasMatch = str.Split(',').Any(x => x.Equals(another));
ViewBag.test = hasMatch ? "Match" : "No Match";
链接地址: http://www.djcxy.com/p/62939.html
上一篇: Why is this code throwing an InvalidOperationException?