如何用LINQ基于平行列表B的条件优雅过滤列表A?
基于平行列表的LINQ过滤方案
针对你需要根据平行列表B的对应索引值过滤列表A的需求,这里提供两种优雅的LINQ实现方式,替代原有的for循环:
方法1:使用Zip配对元素(推荐,可读性更高)
Zip方法可以将两个列表中同索引的元素直接配对,之后筛选符合条件的配对并提取A的元素:
List<string> res = A.Zip(B, (a, b) => new { AElement = a, BElement = b }) .Where(pair => pair.BElement == someVal) .Select(pair => pair.AElement) .ToList();
逻辑说明:
Zip会把A[i]和B[i]组合成一个匿名对象,保证索引严格对应Where筛选出B元素等于目标值的配对Select提取配对中的A元素,最后转成列表
方法2:使用带索引的Select
利用Select的重载同时获取A的元素和其索引,再通过索引访问B的对应元素进行判断:
List<string> res = A.Select((a, i) => new { AElement = a, Index = i }) .Where(item => B[item.Index] == someVal) .Select(item => item.AElement) .ToList();
逻辑说明:
Select((a, i) => ...)同时拿到A的元素a和它的索引iWhere通过索引i获取B[i],判断是否符合条件- 最后提取符合条件的A元素转成列表
重要提醒
绝对不要使用IndexOf(x)来获取索引,如果A中存在重复元素,IndexOf只会返回第一个匹配元素的索引,导致对应B的元素判断错误,完全不符合平行列表的索引对应需求。
内容的提问来源于stack exchange,提问作者APCrowder
相关产品推荐
相关产品推荐

