0

サイズ 85160 のダイナミクスのリストがあります (ただし、変更される可能性があります)。それを 3 つの等しいサイズのリストに分割したいと思います。

リストのサイズを取得することを考えていました。つまり、次のようになります。

int count = rawData.count;

次に、それを 3 で割ります。しかし、最初のセットを 1 つのリストに貼り付け、次に次のセットを貼り付ける方法がわかりません。

それを行う最良の方法は?

4

6 に答える 6

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();
于 2012-08-02T08:56:43.027 に答える
1

コレクション内のアイテムの順序を気にしない場合は、このコードを試してください。

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

于 2012-08-02T09:11:52.687 に答える
0

多分、List.GetRange(int index, int count)助けになりますか?

于 2012-08-02T08:54:59.160 に答える
0

シーケンスをいくつかのサブシーケンスに分割する 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());
        }
    }
}
于 2012-08-02T10:27:12.477 に答える
0
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まですべてを確実に取得するために使用しませんでした。

于 2012-08-02T08:58:54.010 に答える
0

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);
于 2012-08-02T09:12:05.587 に答える