0

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

用高效的代码(可能是 linq)替换 3 层嵌套的 for 循环

但由于我不擅长 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;
}
4

3 回答 3

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

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

于 2012-10-17T02:48:26.210 回答
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
于 2012-10-17T02:46:51.820 回答
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);
于 2012-10-17T02:10:51.503 回答