0

私はすでに次のように関連する質問を投稿しました:

ネストされたforループの3つのレベルを、おそらく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;
}
4

3 に答える 3

2

ラムダ式は非常に読みやすいので、私はラムダ式の方がはるかに好きです。私はこのようなことをします:

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

これはあなたが始めるかもしれません。すべてのクラスのスケルトンバージョンを作成しないと、コードが正しくコンパイルされるか、正しい結果が得られるかを判断するのは少し難しいです。

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 に答える
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 に答える