1

次の 3 レベルのネストされた for ループをより効率的またはクリーンなコードに置き換える方法はありますか? linq はそれをより効率的で読みやすくすることができますか?

助けてください。ありがとう

bool myMatch = false;

foreach (MyEntityClass entitySmallerSet in entitiesSmallerSet)
{
    if (entityLargerSet.Key.Equals(entitySmallerSet.Key))
    {
        foreach (var stringResValLarge in entityLargerSet.StringResourceValues)
        {
            foreach (var stringResValSmall in entitySmallerSet.StringResourceValues)
            {
                if (stringResValSmall.Culture.Equals(stringResValLarge.Culture)
                    && stringResValSmall.Value.Equals(stringResValLarge.Value))
                {
                    myMatch = true;
                }
            }
        }
    }
}
4

3 に答える 3

9
bool myMatch = entitiesSmallerSet
    .Where(e => entityLargerSet.Key.Equal(e.Key))
    .SelectMany(e => e.StringResourceValues)
    .Join(entityLargerSet.StringResourceValues, small => new { Culture = small.Culture, Value = small.Value }, large => new { Culture = large.Culture, Value = large.Value }, (s, l) => new object())
    .Any();

結合の代わりに次を使用できますIntersect

bool myMatch = entitiesSmallerSet
    .Where(e => entityLargerSet.Key.Equal(e.Key))
    .SelectMany(e => e.StringResourceValues)
    .Select(e => new { Culture = e.Culture, Value = e.Value })
    .Intersect(entityLargerSet.StringResourceValues.Select(l => new { Culture = l.Culture, Value = l.Value }))
    .Any();
于 2012-10-16T20:59:44.580 に答える
0

このアイデア (疑似コード) を使用できます。

var myMatch = (from se in entitiesSmallerSet
               where e.Key.Equals(entitySmallerSet.Key)
               from seVal in se.StringResourceValues
               from leVal in entityLargerSet.StringResourceValues
               where seVal.Culture.Equals(leVal.Culture)
                  && leVal.Value.Equals(leVal.Value)
               select seVal).Any();
于 2012-10-16T21:02:16.720 に答える
0

Resharper はこれを使用してこれを行います。

    bool myMatch = false;
    foreach ( var stringResValLarge in 
    from entitySmallerSet 
    in entitiesSmallerSet.Where(entitySmallerSet => entityLargerSet.Key.Equals( entitySmallerSet.Key )) 
    from stringResValLarge in entityLargerSet 
    from stringResValSmall in entitySmallerSet 
    where stringResValSmall.Equals( stringResValLarge )&& stringResValSmall.Equals( stringResValLarge ) 
    select stringResValLarge )
    {
      myMatch = true;
    }

(それを行うために再シャープにするために、ドット小道具のいくつかを削除する必要がありました。)

于 2012-10-16T20:59:36.753 に答える