我有两种在结构上非常相似的方法:
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;
}
理想情况下,我希望有一个通用方法,该方法可以采用任何类型的List并返回该类型的List列表-而不是仅为我可能需要的每种对象类型添加方法。我知道可以使用泛型来执行此操作,但是如何使返回类型与输入相同的泛型呢?
另一个答案很好地说明了如何使用参数多态性-您有两种在结构上相同且仅在类型上不同的方法,因此您可以通过制作由该类型参数化的方法来对其进行泛化。
但是,我们也可以借此机会退后一步,询问我们是否可以解决更一般的问题。假设您有一个序列(比列表更通用),并且希望将其分组为一系列序列。无需将自己限制在列表中;您可以按任何顺序执行此操作:
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();
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句