List<T>
a を異なるチャンクサイズの のリストに分割する次の拡張メソッドがありますが、List<T>
その効率性には疑問があります。それを改善するために私にできることはありますか、それともそのままでいいですか?
public static List<List<T>> Split<T>(this List<T> source, params int[] chunkSizes)
{
int totalSize = chunkSizes.Sum();
int sourceCount = source.Count();
if (totalSize > sourceCount)
{
throw new ArgumentException("Sum of chunk sizes is larger than the number of elements in source.", "chunkSizes");
}
List<List<T>> listOfLists = new List<List<T>>(chunkSizes.Length);
int index = 0;
foreach (int chunkSize in chunkSizes)
{
listOfLists.Add(source.GetRange(index, chunkSize));
index += chunkSize;
}
// Get the entire last part if the total size of all the chunks is less than the actual size of the source
if (totalSize < sourceCount)
{
listOfLists.Add(source.GetRange(index, sourceCount - totalSize));
}
return listOfLists;
}
コードの使用例:
List<int> list = new List<int> { 1,2,4,5,6,7,8,9,10,12,43,23,453,34,23,112,4,23 };
var result = list.Split(2, 3, 3, 2, 1, 3);
Console.WriteLine(result);
これにより、望ましい結果が得られ、チャンクの合計サイズがリストのサイズよりも 4 小さいため、最終的なリスト部分は 4 つの数字になります。
GetRange
これは同じソースを何度も列挙しているだけなのではないかと心配しているので、私は特にその部分を疑っています...
編集:ソースを一度列挙する方法を知っていると思います: ソース自体で foreach を実行し、反復された要素の数が現在のチャンクサイズと同じかどうかを確認し続けます。その場合、新しいリストを追加して、次のチャンクサイズに進みます。考え?