使用 LINQ 在嵌套集合中查找值

rma*_*dov 1 c# linq

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

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

Dav*_*idG 5

您可以使用SelectMany展平集合,然后使用Where

var matches = sections
    .SelectMany(s => s.Fields)
    .Where(f => f.Id == id)
    .Select(f => f.Data);
Run Code Online (Sandbox Code Playgroud)

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

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

data = sections
    .SelectMany(s => s.Fields)
    .SingleOrDefault(f => f.Id == id)
    ?.Data;
Run Code Online (Sandbox Code Playgroud)

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