List<int> ints = new List<int>();
ints.Add(1,5,6);
如何在新串列中獲得 5 和 6?
我試過了,但沒有用
List<int> newList = new List<int>();
newList = ints.Select((i, j) => i - j).Skip(1).ToList();
謝謝,請不要判斷太苛刻,不是專家。
uj5u.com熱心網友回復:
我建議將您的問題分成兩個更簡單的問題:
查找新的連續數字序列開始的所有索引。為此,請遍歷串列并記住(= 放入新串列中)數字不等于前一個數字 1 的所有索引。
在這些索引上拆分您的串列。為此,請遍歷您在步驟 1 中創建的索引串列,并根據這些索引創建新串列。
uj5u.com熱心網友回復:
我懷疑這是您使用 LINQ 的地方:
排序后的唯一數字陣列,格式化后更明顯的是哪些連續數字
var ints = new[] {
1, 2, 3,
5, 6,
8, 9, 10, 11,
15, 16, 17,
20, 21, 22,
25,
27,
30, 31
};
還有一個收集連續資料的 LINQ:
var consecs = ints
.Select((item, idx) => new { I = item, G = item - idx })
.GroupBy(
ig => ig.G,
ig => ig.I,
(k, g) => g.ToArray()
)
.Where(a => a.Length > 1)
.ToArray();
它是如何作業的?
- Select 生成一個新物件,該物件從 0 開始對陣列中的整數進行編號,即您在 中獲得數字本身
item,以及它在 中的索引idx。我們從數字中減去 idex。因為索引每次遞增 1,所以每次也遞增 1 的任何數字運行都將為 G 生成一個固定值:item == 1, idx == 0, G == 1,item == 2, idx == 1, G == 1,item == 3, idx == 2, G == 1,item == 5, idx == 3, G == 2,item == 6, idx == 4, G == 2,- 等等
- 該組有 3 個引數:
- 分組依據:
ig => ig.G- 按 G 分組,這使得 LINQ 將同一 G 中的所有專案收集到一個串列中。呼叫輸入引數是ig因為它是 I 和 G 的匿名型別 - 在 list-of-I-with-same-G 中放入什么:
ig => ig.I- 只是I專案,這意味著輸出將是一個整數串列,即原始專案 - 對輸出串列做什么:
(k, g) => g.ToArray()- 將其從分組轉換為陣列。k是分組鍵(以前稱為 G);我們不需要它。g是 groupby 用相同的 G 收集的數字串列。它通常是一個 Grouping 但我們可以int[]在這個階段將它轉換為
- 分組依據:
- 然后我們運行 a
Where以排除僅包含一項的陣列,因為它們不是兩個或多個數字的連續運行。按輸出分組Enumerable<int[]>是a一個int[] - 最后的 ToArray 只是將陣列的可列舉(為我們過濾的地方)轉換為陣列陣列,因此輸出是
int[][]
這意味著您最終會得到以下組:
consecs[0] -> new [] { 1,2,3 };
consecs[1] -> new [] { 5,6 };
consecs[2] -> new [] { 5,6 };
--
所以你想在沒有 LINQ 的情況下做到這一點?
OK,我們用aDictionary<int,List<int>>來收集同組號下的物品。我們將像以前一樣從 item-index 計算字典的鍵,并確保它作為新串列存在,然后我們將向其中添加專案。然后我們將跳過任何只有 1 大的串列
var ints = new[] {
1, 2, 3,
5, 6,
8, 9, 10, 11,
15, 16, 17,
20, 21, 22,
25,
27,
30, 31
};
var d = new Dictionary<int, List<int>>();
for(int idx = 0; idx < ints.Length; idx ){
var g = ints[idx] - idx;
d.TryAdd(g, new List<int>()); //make sure a list exists for g; does nothing if g is known
d[g].Add(ints[idx]);
}
foreach(var kvp in d){
if(kvp.Value.Count == 1)
continue; //skip lists of only one item
//do whatever with your list of consecutive ints
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/422294.html
標籤:
上一篇:在Linq中將null替換為空
