リストを一連の小さなリストに分割しようとしています。
問題:リストを分割する関数が、リストを正しいサイズのリストに分割しません。サイズ 30 のリストに分割するはずですが、サイズ 114 のリストに分割されます。
関数を使用して、リストをサイズが30 以下のリストの X 個に分割するにはどうすればよいですか?
public static List<List<float[]>> splitList(List <float[]> locations, int nSize=30)
{
List<List<float[]>> list = new List<List<float[]>>();
for (int i=(int)(Math.Ceiling((decimal)(locations.Count/nSize))); i>=0; i--) {
List <float[]> subLocat = new List <float[]>(locations);
if (subLocat.Count >= ((i*nSize)+nSize))
subLocat.RemoveRange(i*nSize, nSize);
else subLocat.RemoveRange(i*nSize, subLocat.Count-(i*nSize));
Debug.Log ("Index: "+i.ToString()+", Size: "+subLocat.Count.ToString());
list.Add (subLocat);
}
return list;
}
サイズ 144 のリストでこの関数を使用すると、出力は次のようになります。
インデックス: 4、サイズ: 120
インデックス: 3、サイズ: 114
インデックス: 2、サイズ: 114
インデックス: 1、サイズ: 114
インデックス: 0、サイズ: 114
ベストアンサー1
指定されたチャンク サイズでソース リストをサブリストに分割するには、次の拡張メソッドを使用することをお勧めします。
/// <summary>
/// Helper methods for the lists.
/// </summary>
public static class ListExtensions
{
public static List<List<T>> ChunkBy<T>(this List<T> source, int chunkSize)
{
return source
.Select((x, i) => new { Index = i, Value = x })
.GroupBy(x => x.Index / chunkSize)
.Select(x => x.Select(v => v.Value).ToList())
.ToList();
}
}
たとえば、18 項目のリストを 5 項目ずつチャンクに分割すると、5-5-5-3 という項目を含む 4 つのサブリストのリストが生成されます。
注:今後の改善
LINQ
点.NET 6
チャンキングは次のようにして実行されます。
const int PAGE_SIZE = 5;
IEnumerable<Movie[]> chunks = movies.Chunk(PAGE_SIZE);