10

我认为我的代码应该使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
}
4

2 回答 2

16

正如您在此处看到的,当调用它的序列为空时,该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# 中被认为更惯用。

于 2013-05-19T15:53:45.090 回答
2

试一试:

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

ViewBag.test = hasMatch ? "Match" : "No Match";
于 2013-05-19T16:02:41.173 回答