c# - 如何在嵌套查询中使用 DefaultIfEmpty

标签 c# linq

我有这门课:

class OriginalClass {
  string FirstItem;
  List<string> ListOfSecondItems;
}

我想将一个类的列表转换为另一个类的列表,或者将这个类“扁平化”为新的类:

class FlattenedClass {
  string First;
  string Second;
}

我正在使用此 LINQ 表达式从一个表达式转换为另一个表达式:

OriginalClass original;
var flattened = from Item in original
  from secondItem in item.ListOfSecondItems
  select new FlattenedClass(item.FirstItem, secondItem);

问题是如果第二项列表为空,我会丢失第一项。如果列表为 null 或为空,我想使用一些“(默认)”值。我想 DefaultIfEmpty 是关键,但不知道如何将它合并到现有查询中。

最佳答案

DefaultIfEmpty 的调用说:“如果 ListOfSecondItems 为空,则使用单个 null。”

var flattened =
  from Item in original
  from secondItem in item.ListOfSecondItems.DefaultIfEmpty()
  select new FlattenedClass(item.FirstItem, secondItem); 

您的问题提到了 ListOfSecondItems 可能为空的可能性。此代码处理这种可能性。它还提供默认字符串而不是 null(使用其他版本的 DefaultIfEmpty)。

var flattened =
  from Item in original
  let subList = item.ListOfSecondItems ?? new List<string>()
  from secondItem in subList.DefaultIfEmpty("(default)")
  select new FlattenedClass(item.FirstItem, secondItem); 

关于c# - 如何在嵌套查询中使用 DefaultIfEmpty,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11191714/

相关文章:

c# - 从代码隐藏(或前端)设置 mailto

c# - 不使用 C# 命名空间有什么危险?

c# - 发送大于 126 字节的 websockets 消息

linq - Go 泛型是否允许 LINQ to Objects 等效?

C# linq filter 加 concat

c# - LINQ-to-objects 中的 Enumerable.Where 是否保留顺序?

c# - C# 中的高性能文件复制?

c# - SQL 选择与带通配符的 URL 匹配的行

c# - 通过在 mysql 中获取最大 x 行加上每组的所有行信息到 linq

c# - 如何使用 C# 将面板中的绘图(内容)保存为物理存储上的任何格式? (窗体)