【发布时间】:2021-03-03 16:46:15
【问题描述】:
所以当我写 C# linq 语句时,我经常想做这样的事情:
string name = database.table.Where(t=>t.Field1 == row.Field1 && t.Field2 == row.Field).Select(b=> b.Name).FirstOrDefault().ToString();
但是,如果上面的语句没有返回任何内容,那么它会出错,因为您不能对空值使用 .FirstOrDefault()。
所以我通常最终会做如下的事情:
var listOfNames = database.table.Where(t=>t.Field1 == row.Field1 && t.Field2 == row.Field).Select(b=> b.Name).ToList();
if(listOfNames.Count() > 0 ){
string name = listOfNames.FirstOrDefault().ToString();
}
上面的代码看起来真的很冗长,我不得不想象在处理潜在的空返回值时有一种更简洁的方法。
任何见解或帮助将不胜感激。谢谢。
【问题讨论】:
-
看看null conditional operator。例如
string name = /* ... */.FirstOrDefault()?.ToString();-> 将name设置为null以获得空序列,否则他将在第一个元素上使用ToString()的结果。 -
您可以在 空序列 上使用
FirstOrDefault(),这是.Where将返回的内容。您不能做的是在null值上调用.ToString(),但在这种情况下,无论如何似乎都没有必要这样做(b.Name可能已经是一个字符串)。如果您将.ToString()反射性地添加到“以防万一”的事物中,这可能是一个不好的习惯,因为非字符串值通常需要自定义处理。