2012-10-17 50 views
0

我已经张贴相关的问题如下:转换多层次的for循环到LINQ或lambda表达式

replace 3 levels of nested for loops by efficient code possibly linq

但因为我不擅长使用LINQ或Lambda表达式..我不知道如何进一步扩展它。

我有一个稍微不同的3级嵌套for循环,我不知道如何将它转换成Linq或Lambda表达式..我一直在工作的任务是提出更有效的替代代码为linq或lambda表达式..请帮助。谢谢..

public static void CompareEntities(
    out EntityCollection<StringResourceEntity> entitiesDifference, 
    EntityCollection<StringResourceEntity> entitiesLargerSet, 
    EntityCollection<StringResourceEntity> entitiesSmallerSet) 
{ 
    var diff = new EntityCollection<StringResourceEntity>(); 
    string defaultCulture = LocalizationConfiguration.DefaultCulture; 

    foreach (StringResourceEntity entityLargerSet in entitiesLargerSet) 
    { 
     bool entityMatch = false; 
     foreach (StringResourceEntity entitySmallerSet in entitiesSmallerSet) 
     { 
      if (entityLargerSet.Key.Equals(entitySmallerSet.Key)) 
      { 
       foreach (var stringResValSmall in entitySmallerSet.StringResourceValues) 
       { 
        if (stringResValSmall.Culture.Equals(defaultCulture) && 
         stringResValSmall.Value.Length > 0) 
        { 
         entityMatch = true; 
        } 
       } 
      } 
     } 

     if (entityMatch == false) 
     { 
      diff.Add(entityLargerSet); 
     } 
    } 

    entitiesDifference = diff; 
} 

回答

2

我更喜欢lambda表达式,因为我觉得他们很有可读性。我会做这样的事情:

var diff = entitiesLargerSet.Where(large => 
    !entitiesSmallerSet.Any(small => 
     small.Key.Equals(large.Key) 
     && small.StringResourceValues.Any(x => 
      x.Culture.Equals(defaultCulture) && x.Value.Length > 0))).ToList(); 

缩进是可怕的,但使它成为你自己的。

+0

柯克,非常酷的答案..谢谢100万..我会回去打这些书,并确保我了解这一点,并建立它。再次感谢。 –

1

这可能会让你开始。如果没有创建所有的类的骨架版本,这是一个有点分不清代码是否编译正确或将产生正确的结果:

var diff = entitiesLargerSet.Except(
      from x in entitiesLargerSet 
      from y in entitiesSmallerSet 
      where x.Key.Equals(y.Key) 
      from z in y.StringResourceValues 
      where stringResValSmall.Culture.Equals(defaultCulture) 
       && stringResValSmall.Value.Length > 0 
      select x); 
+0

感谢马特..这可能只会找到所有匹配..我正在寻找不匹配的记录..感谢您的帮助。 –

+0

哦,我明白了!让我更新答案。挺容易。 –

1
string defaultCulture = LocalizationConfiguration.DefaultCulture; 
var diff = (from x in entitiesLargerSet 
      let matches = entitiesSmallerSet.Where(y => 
       x.Key.Equals(y.Key) && 
       y.StringResourceValues.Any(z => z.Culture.Equals(defaultCulture) && 
                z.Value.Length > 0)) 
      where matches.Any() == false 
      select x).ToList(); 
// TODO: Convert List to EntityCollection 
+0

非常感谢...我真的很喜欢你的答案,但我要检查柯克的答案。再次感谢你!! –