为什么此代码抛出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?

下一篇: Signing an Xml Document using RSA