2014-02-17 51 views
1

我有一個對象列表(即整數),我想用LINQ聚合子列表。使用LINQ的聚合子列表

例如:

最初的名單:[ 1, 4, 5, 3, 4, 10, 4, 12 ]

子列表:[ [1,4,5,3], [4,5,3,4], [5,3,4,10], [3,4,10,4], [4,10,4,12] ]

結果(彙總表):[ 5, 5, 10, 10, 12 ]

我想創建每個ele的最大子列表包含它自己和以下n = 3元素。這可能與LINQ或我需要創建自己的聚合機制?

由於提前,基督教

+5

如何是與 「子列表」 原單? –

+0

我假設它顯示瞭如何創建子列表。但也沒有看到任何問題 –

+0

問題你需要在你的問題上更清楚一點。你有沒有嘗試過自己呢? –

回答

6
public IEnumerable<IEnumerable<int>> GetSubLists(int[] collection) 
{ 
    for(int i = 0; i< collection.Length - 3; i++) 
     yield return collection.Skip(i).Take(4); 
} 

GetSubLists(original).Select(l => l.Max()); 

或者在一行

int[] original = {1, 4, 5, 3, 4, 10, 4, 12 }; 
int chunkCount = 4; 
Enumerable.Range(0, original.Length - chunkCount + 1).Select(i => original.Skip(i).Take(chunkCount)) 
.Select(l => l.Max()); 
+0

您的最後一種方法會生成「{5,5,10}」而不是「{5,5,10,10,12}」。另外值得注意的是,在每次迭代中跳過原始列表中的所有項目效率非常低 –

+0

糟糕,應該是+ 1而不是-1。謝謝,編輯,同意關於跳過,但我選擇了數組,它沒有適當的GetRange方法。對於小型數組,這是可以的 –

+0

'GetSubLists'方法會在最後產生小於4的塊。 '(new [] {1,2,3})。拿(4)'產生'{1,2,3}' – 3dGrabber

1
var result = sublists.Select(sl => sl.Max()); 
// [5,5,10,10,12] 

創建子列表:

List<int> original = new List<int> { 1, 4, 5, 3, 4, 10, 4, 12 }; 
int sublistSize = 4; 
// check if original size is greater than required sublistSize 
var sublists = Enumerable.Range(0, original.Count - sublistSize + 1) 
         .Select(i => original.GetRange(i, sublistSize)); 

// [[1,4,5,3],[4,5,3,4],[5,3,4,10],[3,4,10,4],[4,10,4,12]] 
+0

是否有自動創建子列表的方法? 'list.MAGIC_METHOD_TO_CREATE_SUBLISTS.Select(sl => sl.Max())' – Greeny

+0

@Greeny你不清楚你想創建子列表。使用子列表創建更新答案 –

0
IEnumerable<int[]> GetLists (int[] list, int size) 
    { 
     return Enumerable.Range(0, list.Length - size + 1).Select(x => list.Skip(x).Take(size).ToArray()); 
    } 

樣品:

var list = new[] {1, 4, 5, 3, 4, 10, 4, 12}; 
    var max = GetLists(list, 4).Select(x => x.Max()).ToArray(); 
0

Sub-lists中間結果可以與「滑動窗口」的功能來構成。

然後,所需的Result是功能Max()通過與Select()窗口映射。

var originalList = new [] {1, 4, 5, 3, 4, 10, 4, 12}; 
var sublists  = originalList.Window(4);   // [ [1,4,5,3], [4,5,3,4], ... ] 
var result  = sublists.Select(Enumerable.Max); // [ 5, 5, 10, 10, 12 ] 


高效Window功能:

public static IEnumerable<IEnumerable<T>> Window<T>(this IEnumerable<T> source, 
                    int windowSize) 
{ 
    if(windowSize < 1) throw new ArgumentException("windowSize must positive", "windowSize"); 

    var q = new Queue<T>(windowSize); 
    foreach(var e in source) 
    { 
     q.Enqueue(e); 
     if(q.Count < windowSize) continue; // queue not full yet 

     yield return q; 
     q.Dequeue(); 
    } 
}