如何用LINQ简化合并两个不同类型IEnumerable的一对多关联操作?
用LINQ简化笛卡尔积关联操作
当然可以用LINQ来简化你现在的嵌套循环逻辑!你要实现的其实是两个集合的笛卡尔积(每篇文章和所有计量单位配对),LINQ里的SelectMany方法就是干这个的完美工具,它能帮你把嵌套的循环逻辑转换成更简洁、可读性更强的链式调用或者查询表达式。
方法链写法
var searchList = articlelist .SelectMany(article => measureList, (article, measureUnit) => new Models.SearchItem { IDItem = measureUnit.IDMeasureUnit, PrincipalProperty = article.Description, SecondaryProperty = measureUnit.Description }) .ToList();
查询表达式写法
如果你更喜欢SQL风格的查询语法,也可以这样写:
var searchList = (from article in articlelist from measureUnit in measureList select new Models.SearchItem { IDItem = measureUnit.IDMeasureUnit, PrincipalProperty = article.Description, SecondaryProperty = measureUnit.Description }).ToList();
逻辑说明
这两种写法和你原来的嵌套循环逻辑完全等价:
SelectMany(或者查询表达式里的两个from)会遍历每一篇article,然后对每篇文章遍历所有的measureUnit- 每一组
article和measureUnit配对后,都会生成一个新的SearchItem对象 - 最后调用
ToList()把结果转换成List集合,和你原来的Add逻辑一致
这样写不仅代码更紧凑,也更符合LINQ的声明式编程风格,读起来能直接明白你要做什么,而不是关注怎么循环的细节。
内容的提问来源于stack exchange,提问作者Pozeras
相关产品推荐
相关产品推荐

