2017-08-14 132 views
0

我是LINQ的新手,帮我将这种嵌套的代码行转换为LINQ。嵌套的foreach到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}); 
     } 
    } 
} 

尝试查询:

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 
    })); 
+5

请显示您尝试过的内容。 'SelectMany'可以提供帮助 –

+1

我看不到您的尝试 –

+0

我无法写出这个问题的查询。 @MarcoSalerno – siddharth

回答

3

你几乎没有。你的问题是,在SelectMany您筛选使用Where的INSEAD使用Select

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 
     })); 
  • Where - 过滤值基于谓词
  • Select序列 - 项目的每一个元素序列化为新的形式
+0

这里的格式是非常具有欺骗性的 - 它看起来像'Where'的结果上调用'Select',但它是实际上调用了SelectMany的结果。我强烈建议您将第2-5行的第2行替换为“Select”调用与“SelectMany”一致。 –

+0

@GiladGreen,Select()块中的'r'是不可识别的。它的范围仅在SelectMany()中。 我得到“名称'r'不在当前上下文中”错误。 – siddharth

+0

@siddharth - 更正 - 忘记在'select'中添加'r =>' –

2

你必须使用SelectMany

的代码将是这样的:

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); 
0

你可以试试下面的代码:

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 }));