将多级 for 循环转换为 linq 或 lambda 表达式

Posted

技术标签:

【中文标题】将多级 for 循环转换为 linq 或 lambda 表达式【英文标题】:convert multi level for loop into linq or lambda expression 【发布时间】:2012-10-07 05:10:05 【问题描述】:

我已经发布了相关问题如下:

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;

【问题讨论】:

【参考方案1】:

我更喜欢 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();

缩进很可怕,但请自己制作。

【讨论】:

柯克,非常酷的答案.. 谢谢一百万.. 我会回去看书,确保我理解这一点并以此为基础。再次感谢。【参考方案2】:
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

【讨论】:

谢谢冒险...我真的很喜欢你的回答,但我要检查柯克的回答。再次感谢您!【参考方案3】:

这可能会让您入门。如果不创建所有类的骨架版本,就很难判断代码是否正确编译或会产生正确的结果:

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

【讨论】:

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

以上是关于将多级 for 循环转换为 linq 或 lambda 表达式的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Lambda 或 Linq 将匿名类型转换为原始类型成员

如何将令人烦恼的“for”循环转换为“Object.keys”例程或类似程序(JSLint)

将 excel 或 csv 文件转换为 pandas 多级数据框

如何在for-of中使用array.slice转换for循环或为生成的列和行映射array.slice?

在 for 循环中将 Python Dask 系列转换为列表或 Dask DataFrame

如何将ForEach转换为For循环