C# 嵌套foreach到Linq
我是LINQ新手,请帮助我将这一嵌套代码行转换为LINQC# 嵌套foreach到Linq,c#,linq,C#,Linq,我是LINQ新手,请帮助我将这一嵌套代码行转换为LINQ foreach(var rule in rules) { foreach(var package in packages) { if(rule.KeyFrom == package.Key || rule.KeyTo == package.Key) { filteredRule.Add(new RuleModel{Package = new List<strin
foreach(var rule in rules)
{
foreach(var package in packages)
{
if(rule.KeyFrom == package.Key || rule.KeyTo == package.Key)
{
filteredRule.Add(new RuleModel{Package = new List<string>{rule.KeyTo, rule.KeyFrom}, Rule = rule.Rule});
}
}
}
foreach(规则中的var规则)
{
foreach(包中的var包)
{
if(rule.KeyFrom==package.Key | | rule.KeyTo==package.Key)
{
添加(新规则模型{Package=new List{rule.KeyTo,rule.KeyFrom},rule=rule.rule});
}
}
}
尝试的查询:
rules.SelectMany(r => packages.Select(p => p.Key == r.KeyFrom || p.Key == r.KeyTo))
.Select(new RuleModel {
Package = new List<string>{ r.Keyfrom, r.KeyTo},
Rule = r.Rule
}));
rules.SelectMany(r=>packages.Select(p=>p.Key==r.KeyFrom | | p.Key==r.KeyTo))
.选择(新规则模型){
Package=新列表{r.Keyfrom,r.KeyTo},
规则
}));
您必须使用选择多个
代码如下所示:
var ruleModels = rules.SelectMany(r => r.packages).Where(rule.KeyFrom == package.Key || rule.KeyTo == package.Key).Select(r => new RuleModel{Package = new List<string>{r.KeyTo, r.KeyFrom}, Rule = r.Rule});
filteredRule.AddRange(ruleModels);
var ruleModels=rules.SelectMany(r=>r.packages)。其中(rule.KeyFrom==package.Key | | rule.KeyTo==package.Key)。选择(r=>new RuleModel{package=new List{r.KeyTo,r.KeyFrom},rule=r.rule});
filteredRule.AddRange(规则模型);
您必须使用选择多个
代码如下所示:
var ruleModels = rules.SelectMany(r => r.packages).Where(rule.KeyFrom == package.Key || rule.KeyTo == package.Key).Select(r => new RuleModel{Package = new List<string>{r.KeyTo, r.KeyFrom}, Rule = r.Rule});
filteredRule.AddRange(ruleModels);
var ruleModels=rules.SelectMany(r=>r.packages)。其中(rule.KeyFrom==package.Key | | rule.KeyTo==package.Key)。选择(r=>new RuleModel{package=new List{r.KeyTo,r.KeyFrom},rule=r.rule});
filteredRule.AddRange(规则模型);
您可以尝试以下代码:
filteredRule.AddRange(rules.Where(b =>
packages.Any(a => b.KeyFrom == a.Key || b.KeyTo == a.Key)).select(
p=>new new RuleModel { Package = new List<string>
{ p.KeyTo, p.KeyFrom }, Rule = p.Rule }));
filteredRule.AddRange(rules.Where(b=>
packages.Any(a=>b.KeyFrom==a.Key | | b.KeyTo==a.Key))。选择(
p=>新规则模型{Package=新列表
{p.KeyTo,p.KeyFrom},Rule=p.Rule});
您可以尝试以下代码:
filteredRule.AddRange(rules.Where(b =>
packages.Any(a => b.KeyFrom == a.Key || b.KeyTo == a.Key)).select(
p=>new new RuleModel { Package = new List<string>
{ p.KeyTo, p.KeyFrom }, Rule = p.Rule }));
filteredRule.AddRange(rules.Where(b=>
packages.Any(a=>b.KeyFrom==a.Key | | b.KeyTo==a.Key))。选择(
p=>新规则模型{Package=新列表
{p.KeyTo,p.KeyFrom},Rule=p.Rule});
你就快到了。您的问题是,在SelectMany
中,您使用Select
进行过滤,而不是使用Where
:
rules.SelectMany(r => packages.Where(p => p.Key == r.KeyFrom || p.Key == r.KeyTo))
.Select(r => new RuleModel {
Package = new List<string>{ r.Keyfrom, r.KeyTo},
Rule = r.Rule
}));
rules.SelectMany(r=>packages.Where(p=>p.Key==r.KeyFrom | | p.Key==r.KeyTo))
.选择(r=>new RuleModel{
Package=新列表{r.Keyfrom,r.KeyTo},
规则
}));
- -根据谓词筛选值序列
- -将序列的每个元素投影到新形式中
- 你就快到了。您的问题是,在
SelectMany
中,您使用Select
进行过滤,而不是使用Where
:
rules.SelectMany(r => packages.Where(p => p.Key == r.KeyFrom || p.Key == r.KeyTo))
.Select(r => new RuleModel {
Package = new List<string>{ r.Keyfrom, r.KeyTo},
Rule = r.Rule
}));
rules.SelectMany(r=>packages.Where(p=>p.Key==r.KeyFrom | | p.Key==r.KeyTo))
.选择(r=>new RuleModel{
Package=新列表{r.Keyfrom,r.KeyTo},
规则
}));
- -根据谓词筛选值序列
- -将序列的每个元素投影到新形式中
SelectMany
可以帮助我看不到您的尝试我无法编写问题所在的查询@MarcoSalerNoren难道你不能尝试吗?如此有效的方法是你展示尝试。即使它不完整,但仍然显示出一些努力。我们可以从那里帮助纠正错误。这里有很多Linq示例和前面的问题,请展示您的尝试SelectMany
可以帮助我看不到您的尝试我无法编写问题所在的查询@MarcoSalerNoren难道你不能尝试吗?如此有效的方法是你展示尝试。即使它不完整,但仍然显示出一些努力。我们可以从那里帮助纠正错误。这里有许多Linq示例和以前的问题。这里的格式非常具有欺骗性-它看起来像是在Where
的结果中调用选择
,但实际上它是在选择多个
的结果中调用的。我强烈建议您删除第2-5行,以便无法识别Select()块中的Select
调用与SelectMany
@GiladGreen“r”对齐。它的作用域仅在SelectMany()中。我收到“名称“r”不在当前上下文中”错误。@siddharth-已更正-忘记在select
中添加r=>
,那么它将是包的一个实例。@siddharth-Yes-SelectMany
为规则的每个项返回许多项。Where
返回满足谓词的包。因此,SelectMany
返回packagest此处的格式设置非常具有欺骗性-看起来,Select
是根据Where
的结果调用的,但实际上是根据SelectMany
的结果调用的。我强烈建议您删除第2-5行,以便无法识别Select()块中的Select
调用与SelectMany
@GiladGreen“r”对齐。它的作用域仅在SelectMany()中。我收到“名称“r”不在当前上下文中”错误。@siddharth-已更正-忘记在select
中添加r=>
,那么它将是包的一个实例。@siddharth-Yes-SelectMany
为规则的每个项返回许多项。Where
返回满足谓词的包。因此SelectMany
返回软件包