C# 嵌套foreach到Linq

C# 嵌套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

我是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<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
      返回软件包