【问题标题】:C# LINQ How to efficiently deal with a null return?C# LINQ 如何有效地处理空返回?
【发布时间】: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() 反射性地添加到“以防万一”的事物中,这可能是一个不好的习惯,因为非字符串值通常需要自定义处理。

标签: c# linq lambda


【解决方案1】:

你有几种方法:

  1. 不要使用ToString() 我猜名字已经是string/varchar了
string name = database.table
  .Where(t=>t.Field1 == row.Field1 && t.Field2 == row.Field)
  .Select(b=> b.Name)
  .FirstOrDefault()
// name now can be null since default(string) is null
  1. 如果您需要 ToString,那么您可以使用 C# 6 功能 – Null-conditional (?.)
string name = database.table
  .Where(t=>t.Field1 == row.Field1 && t.Field2 == row.Field)
  .Select(b=> b.Name)
  .FirstOrDefault()?.ToString(); // here ?
// name now can be null
  1. 还要考虑空合并 (??) 运算符
string name = database.table
  .Where(t=>t.Field1 == row.Field1 && t.Field2 == row.Field)
  .Select(b=> b.Name)
  .FirstOrDefault() ?? "some value"
// so if FirstOrDefault returns null then "some value" will be used

【讨论】:

    【解决方案2】:

    结合.Where.FirstOrDefault

    string name = database.table
      .FirstOrDefault(t=>t.Field1 == row.Field1 && t.Field2 == row.Field)
      ?.Name;
    

    【讨论】:

      猜你喜欢
      • 2021-01-18
      • 1970-01-01
      • 1970-01-01
      • 2022-12-06
      • 2022-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多