合并列表中的所有对(第一对和最后一对除外)(将值相加,减少为单个元素)



目标

通过将列表中的对(除了第一对和最后一对)合并为单个元素来减少列表的总长度。

视觉示例

我有一个一维列表,看起来有点像:

对(A

使用循环听起来相当简单

var outList = new List<int>();
outList.Add(inList[0]);
outList.Add(inList[1]);
for(int x = 2; x < inList.Count -2;x+=2){
outList.Add(inList[x] + inList[x+1]);
}
outList.Add(inList[^2]);
outList.Add(inList[^1]);

您保持前两个元素不变,然后运行一个循环,将一对元素相加,并将结果Add添加到outList,停止处理最后两个条目,然后将它们逐字添加到outList

如果目的是修改原始列表,则在结束和开始之间向后两次

for(int x = list.Count - 4; x >= 2;x-=2){
list[x] += list[x+1];
list.RemoveAt(x+1);
}

通过向后操作,随着列表的缩短,我们的操作(从列表中删除)不会影响我们尚未处理的未来元素,这使逻辑更容易

--

LINQ是一把锤子;不是每个问题都是钉子。。如果你只能接受LINQ,那么它可能看起来像:

list.Take(2).Concat(
list.Skip(2)
.Take(list.Count-4)
.Select((e, i) => new { E = e, N = i/2 })
.GroupBy(x => x.N, x => x.E)
.Select(g => g.Sum())
).Concat(
list.Skip(list.Count-2)
).ToList();

或范围:

list[..2].Concat(
list[2..^2]
.Select((e, i) => new { E = e, N = i/2 })
.GroupBy(x => x.N, x => x.E)
.Select(g => g.Sum())
).Concat(
list[^2..]
).ToList();

取前2个,加上取中间N个值的结果,投影它们,包括它们的索引,并在index/2上分组,然后对结果组求和,然后在最后2个上Concat。我不像循环那样喜欢它。我也能想出其他的林克方式,但没有一种是我真正喜欢的。

最新更新