C# 使用LINQ查找嵌套集合中的值
下面是我想转换为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
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;
请注意
?
,以防没有匹配项。选择,选择多个和第一个默认值()
(或者在您的情况下,最后一个默认值
)。选择多个和第一个默认值()
(或者在您的情况下,最后一个默认值
)。