サイズ 85160 のダイナミクスのリストがあります (ただし、変更される可能性があります)。それを 3 つの等しいサイズのリストに分割したいと思います。
リストのサイズを取得することを考えていました。つまり、次のようになります。
int count = rawData.count;
次に、それを 3 で割ります。しかし、最初のセットを 1 つのリストに貼り付け、次に次のセットを貼り付ける方法がわかりません。
それを行う最良の方法は?
これはうまくいくはずです。
var items = rawData.Count / 3;
var first = rawData.Take(items).ToList();
var second = rawData.Skip(items).Take(items).ToList();
var third = rawDate.Skip(2 * items).ToList();
コレクション内のアイテムの順序を気にしない場合は、このコードを試してください。
static IEnumerable<IEnumerable<int>> Split(IList<int> source, int count)
{
return source
.Select((value, index) => new { Index = index % count, Value = value })
.GroupBy(pair => pair.Index)
.Select(grp => grp.Select(g => g.Value));
}
使用例
static void Main()
{
var arrays = Split(new[]{1,2,3,4,5,6,7,8,9,0}, 3);
foreach(var array in arrays)
{
foreach(var item in array)
Console.WriteLine(item);
Console.WriteLine("---------------");
}
}
あなたにあげます
1 4 7 0
2 5 8
3 6 9
多分、List.GetRange(int index, int count)
助けになりますか?
シーケンスをいくつかのサブシーケンスに分割する IEnumerable の拡張機能を使用するソリューションを次に示します。
using System;
using System.Collections.Generic;
using System.Linq;
namespace Demo
{
class Program
{
static void Main(string[] args)
{
int count = 85160;
var someNumbers = Enumerable.Range(0, count).ToList();
var lists = PartitionToEqualSizedLists(someNumbers, 3);
foreach (var list in lists)
{
Console.WriteLine("List length = " + list.Count);
}
Console.WriteLine("\nDone.");
Console.ReadLine();
}
public static List<List<T>> PartitionToEqualSizedLists<T>(List<T> input, int numPartitions)
{
int blockSize = (input.Count + numPartitions - 1)/numPartitions;
return input.Partition(blockSize).Select(partition => partition.ToList()).ToList();
}
}
public static class EnumerableExt
{
public static IEnumerable<IEnumerable<T>> Partition<T>(this IEnumerable<T> input, int blockSize)
{
var enumerator = input.GetEnumerator();
while (enumerator.MoveNext())
{
yield return nextPartition(enumerator, blockSize);
}
}
private static IEnumerable<T> nextPartition<T>(IEnumerator<T> enumerator, int blockSize)
{
do
{
yield return enumerator.Current;
}
while (--blockSize > 0 && enumerator.MoveNext());
}
}
}
var lists = new List<List<YourObject>>();
int chunkCount = 3;
int chunk = rawData / chunkCount;
for (int i = 0; i < chunkCount; i++)
{
var data = rawData.Skip(i * chunk);
if (i < chunkCount - 1)
data = data.Take(chunk);
lists.Add(data.ToList());
}
When i == chunkCount - 1
(最後の繰り返し) 最後Take
まですべてを確実に取得するために使用しませんでした。
IEnumerables
まあ、このような拡張機能を使用して、一般的にすべてのことを行うことができます。
public static IEnumerable<IEnumerable<T>> Chop<T>(
this IEnumerable<T> source,
int chopCount)
{
var chops = new IList<T>[chopCount];
for (i = 0; i < chops.Length; i++)
{
chops[i] = new List<T>();
}
var nextChop = 0;
foreach (T item in source)
{
chop[nextChop].Add(item);
nextChop = nextChop == chopCount - 1 ? 0 : nextChop + 1;
}
for (i = 0; i < chops.Length; i++)
{
yield return chops[i];
}
}
このように使用できます
var chops = rawData.Chop(3);