将多级 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?