2016-04-29 98 views
0

我有兩種方法在結構上非常相似:如何使用泛型來創建通用的分塊算法?

public static List<List<NodeAttribute>> chunkList(List<NodeAttribute> list, int nSize = 30) 
    { 
     List<List<NodeAttribute>> chunkedList = new List<List<NodeAttribute>>(); 

     for (var i = 0; i < list.Count; i += nSize) 
     { 
      chunkedList.Add(list.GetRange(i, Math.Min(nSize, list.Count - i))); 
     } 

     return chunkedList; 
    } 

public static List<List<int>> chunkList(List<int> list, int nSize = 30) 
    { 
     List<List<int>> chunkedList = new List<List<int>>(); 

     for (var i = 0; i < list.Count; i += nSize) 
     { 
      chunkedList.Add(list.GetRange(i, Math.Min(nSize, list.Count - i))); 
     } 

     return chunkedList; 
    } 

理想情況下,我想有一個可以採取任何類型和返回列表的通用方法該類型的列表的列表 - 而不是隻爲我可能需要的每種對象類型添加方法。我知道我可以使用泛型來做到這一點,但是如何使返回類型與輸入一樣具有泛型?

回答

8

對方回答確實說明了如何使用參數多態性的一個好工作 - 你有兩種方法在結構上相同,僅在一個類型不同,所以你可以泛化它通過製作一個由該類型參數化的方法。

但是我們也可以藉此機會退後一步,問我們是否可以解決一個更普遍的問題。假設您有一個序列 - 比列表更通用 - 並且您希望將其分組爲序列序列。沒有必要限制自己的名單,你可以在任何類型的序列做此操作:

public static IEnumerable<IEnumerable<T>> Chunk(
    this IEnumerable<T> items, int size) 
{ 
    return items 
    .Select((item, index) => new { Group = index/size, Item = item }) 
    .GroupBy(x => x.Group) 
    .Select(group => group.Select(g => g.Item)); 
} 

如果你希望它是名單畢竟名單,這是很容易的;將最後一行更改爲:

.Select(group => group.Select(g => g.Item).ToList()).ToList(); 
5

將方法定義爲泛型,然後您可以使用相同的泛型類型聲明參數並返回。

事情是這樣的:

public static List<List<T>> ChunkList<T>(List<T> list, int nSize = 30) 
{ 
    List<List<T>> chunkedList = new List<List<T>>(); 

    for (var i = 0; i < list.Count; i += nSize) 
    { 
     chunkedList.Add(list.GetRange(i, Math.Min(nSize, list.Count - i))); 
    } 

    return chunkedList; 
} 
相關問題