目標
通過將串列中的對(除了第一對和最后一對)合并為單個元素來減少串列的總長度。
視覺示例
我有一個單維串列,看起來有點像這樣:
| 對 (A) | 對 (B) | 對 (C) | 對 (D) |
|---|
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|
| 12.0 | 10.0 | 19.0 | 34.0 | 16.0 | 12.0 | 99.0 | 68.0 |
我希望串列(或新串列)看起來像的示例:
| 對 (A) | 對 (B) | 對 (C) |
|---|
| 0 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
| 12.0 | 10.0 | 53.0 | 28.0 | 99.0 | 68.0 |
仍然是單維串列,但總長度已通過將元素對(忽略第一對和最后一對)合并為單個元素(而不是一對元素)來減少,并通過將前對值加在一起計算出新值.
理論
使用的某種組合GetRange,Select,Aggregate和Where要么改變原來的串列,或回傳一個新的串列莫名其妙。
閉幕式
我想為我的問題的狡猾措辭和格式道歉:我顯然對我想要實作的目標不了解 -任何幫助將不勝感激。
干杯。
uj5u.com熱心網友回復:
使用回圈聽起來相當簡單
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,停止處理最后 2 個條目,然后將這些逐字添加到 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。我不喜歡它回圈。我也可以想到其他的 linq 方法,但沒有一個是我真正喜歡的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/335999.html
