如何使用LINQ查询多个列表并选择多项,简化现有实现代码
简化方案
你原来的代码重复执行了两次完全相同的笛卡尔积筛选逻辑,仅返回值不同,我们可以一次筛选出符合条件的奇偶配对后,直接把两个值都合并到结果序列中,既减少了重复计算,也缩短了代码:
方法1:方法链写法(更简洁)
IEnumerable<int> query1 = evens .SelectMany(e => odds, (e, o) => new { e, o }) .Where(pair => pair.e > pair.o * 2) .SelectMany(pair => new[] { pair.e, pair.o }) .Distinct() .OrderBy(n => n); // 遍历输出逻辑和原代码一致 foreach (int item in query1) { Console.WriteLine(item); }
方法2:查询语法写法
如果偏好LINQ查询语法,也可以写成:
IEnumerable<int> query1 = ( from e in evens from o in odds where e > o * 2 from n in new[] { e, o } select n ).Distinct().OrderBy(n => n);
逻辑说明
上述两种写法和原实现逻辑完全等价:
- 一次完成偶数、奇数的笛卡尔积筛选,避免重复执行相同的判断逻辑
- 通过
SelectMany把符合条件的e(偶数)和o(奇数)直接展平到同一个结果序列 Distinct去重+OrderBy升序排序的效果和原代码的Union+排序完全一致
内容的提问来源于stack exchange,提问作者Jaedon Lippert
相关产品推荐
相关产品推荐

