【问题标题】:Use LINQ to find value inside a nested collection使用 LINQ 在嵌套集合中查找值
【发布时间】:2017-02-23 00:39:44
【问题描述】:

我想将以下 sn-p 代码转换为 LINQ。目标是在内部集合中找到匹配项并返回其 Data 属性。有什么建议吗?

    string data = null;
    foreach (var section in sections)
    {
        foreach (var field in section.Fields)
        {
            if (field.Id == id)
            {
                data = field.Data;
            }
        }
    }

【问题讨论】:

  • Select、SelectMany 和 FirstOrDefault()(或者在你的情况下,LastOrDefault)。

标签: c# linq


【解决方案1】:

您可以使用SelectMany 来展平集合,然后使用Where 过滤它

var matches = sections
    .SelectMany(s => s.Fields)
    .Where(f => f.Id == id)
    .Select(f => f.Data);

现在matches 包含所有匹配的数据字符串。如果您只有一个匹配项,则可以使用Single(或SingleOrDefault,如果可能没有)来获得该单独的值。如果您可能有更多匹配项,请使用FirstOrDefault 或LastOrDefault。 (在您的代码中,Last 是给您相同答案的方法)

您可以将所有这些放在一起并简化:

data = sections
    .SelectMany(s => s.Fields)
    .SingleOrDefault(f => f.Id == id)
    ?.Data;

请注意?,以防万一您没有匹配项。

【讨论】:

    【解决方案2】:

    根据 Rob 的评论,以下代码将起作用:

    sections.SelectMany(x => x.Fields).Where(field => field.Id == id).Select(field => field.Data).FirstOrDefault()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-10
      • 1970-01-01
      • 2021-08-20
      • 2010-10-17
      • 2014-05-18
      • 2019-12-31
      • 1970-01-01
      相关资源
      最近更新 更多