如何用LINQ实现:获取列表中每个元素对应的其余所有元素?
LINQ实现排除自身元素的列表生成
针对你的需求,这里提供两种简洁的LINQ解决方案,替代嵌套循环的实现:
方法1:通过Take+Skip拼接前后元素
利用Take获取当前索引之前的所有元素,Skip获取当前索引之后的所有元素,再通过Concat合并两部分:
List<int> myList = new List<int> {5, 3, 7, 5, 7, 10}; var result = myList.Select((_, index) => myList.Take(index).Concat(myList.Skip(index + 1)).ToList()) .ToList();
- 这里用下划线
_忽略当前元素(因为我们只需要它的索引) Take(index)取列表前index个元素,Skip(index+1)跳过前index+1个元素(即跳过当前元素),剩下的就是后面的所有元素- 最终每个子列表都是原列表排除当前索引元素后的结果
方法2:通过带索引的Where筛选
直接用Where结合索引条件,过滤掉当前位置的元素:
var result = myList.Select((_, index) => myList.Where((_, idx) => idx != index).ToList()) .ToList();
Where的第二个参数是元素的索引,判断索引不等于当前处理的index即可排除自身
关于TakeWhile/SkipWhile失效的原因
你之前尝试的TakeWhile和SkipWhile是按元素值的条件判断,而不是按索引位置。比如原列表有重复的5,当处理第一个5时,TakeWhile(x => x != 5)会直接返回空列表,而不是取到索引0之前的元素,这就不符合需求。所以针对按位置排除的场景,用基于索引的Take/Skip或带索引的Where更准确。
内容的提问来源于stack exchange,提问作者user1953684
相关产品推荐
相关产品推荐

