C# 使用LINQ查找嵌套集合中的值

C# 使用LINQ查找嵌套集合中的值,c#,linq,C#,Linq,下面是我想转换为LINQ的代码片段。目标是在内部集合中找到匹配项并返回其数据属性。有什么建议吗 string data = null; foreach (var section in sections) { foreach (var field in section.Fields) { if (field.Id == id) { data = field.Dat

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

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

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

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

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

sections.SelectMany(x => x.Fields).Where(field => field.Id == id).Select(field => field.Data).FirstOrDefault()
您可以使用将集合展平,然后使用
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;
请注意
以防没有匹配项。

您可以使用将集合展平,然后使用
在其中

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;

请注意
,以防没有匹配项。

选择
选择多个
第一个默认值()
(或者在您的情况下,
最后一个默认值
)。
选择多个
第一个默认值()
(或者在您的情况下,
最后一个默认值
)。