0

これを半@ssすることはできますが、後で処理する手間がかからないようなクリーンな方法が必要です。

private String[][] SplitInto10(string[] currTermPairs)
{
   //what do i put in here to return 10 string arrays
   //they are all elements of currTermPairs, just split into 10 arrays.
}

したがって、基本的には、文字列配列 (currTermPairs) を 10 個または 11 個の異なる文字列配列に均等に分割したいと考えています。NO DATA が失われ、すべての要素が正常に転送されていることを確認する必要があります

編集: n サイズの文字列配列が与えられます。必要なのは、メソッドが指定された文字列配列から 10 個の文字列配列/リストを返す必要があることです。つまり、配列を 10 個の部分に分割します。

たとえば、私が持っている場合

 A B C D E F G H I J K L M N O P Q R S T U

サイズに応じて、10個の文字列配列または11個の文字列配列に分割する必要があるため、この場合は

A B
C D
E F
G H 
I J
K L
M N 
O P 
Q R 
S T 
U   <--Notice this is the 11th array and it is the remainder
4

6 に答える 6

5

代わりに剰余%演算子を使用します。ここでは、Linq アプローチを使用します。

string[][] allArrays = currTermPairs
            .Select((str, index) => new { str, index })
            .GroupBy(x => x.index % 10)
            .Select(g => g.Select(x => x.str).ToArray())
            .ToArray();

デモ(配列ごとに 2 つの文字列を使用)

于 2013-01-10T15:26:55.053 に答える
2

これは、配列とforループに慣れたい場合に備えて、LINQを使用しないソリューションです。

// Determine the number of partitions.
int parts = currTermPairs.Length < 10 ? currTermPairs.Length : 10;

// Create the result array and determine the average length of the partitions.
var result = new string[parts][];
double avgLength = (double)currTermPairs.Length / parts;

double processedLength = 0.0;
int currentStart = 0;
for (int i = 0; i < parts; i++) {
    processedLength += avgLength;
    int currentEnd = (int)Math.Round(processedLength);
    int partLength = currentEnd - currentStart;
    result[i] = new string[partLength];
    Array.Copy(currTermPairs, currentStart, result[i], 0, partLength);
    currentStart = currentEnd;
}
return result;

アイテムの総数は10で割り切れない場合があります。問題は、さまざまな長さのパーツがどのように分散されるかです。ここで私はそれらを均等に分配しようとします。キャストに注意してください(double)currTermPairs.Length。これは、整数除算ではなく浮動小数点除算を取得するために必要です。

ここに少しテスト方法があります:

const int N = 35;
var arr = new string[N];
for (int i = 0; i < N; i++) {
    arr[i] = i.ToString("00");
}

var result = new PatrtitioningArray().SplitInto10(arr);
for (int i = 0; i < result.Length; i++) {
    Console.Write("{0}:   ", i);
    for (int k = 0; k < result[i].Length; k++) {
        Console.Write("{0}, ", result[i][k]);
    }
    Console.WriteLine();
}

その出力は(35要素で):

0:   00, 01, 02, 03, 
1:   04, 05, 06, 
2:   07, 08, 09, 
3:   10, 11, 12, 13, 
4:   14, 15, 16, 17, 
5:   18, 19, 20, 
6:   21, 22, 23, 
7:   24, 25, 26, 27, 
8:   28, 29, 30, 31, 
9:   32, 33, 34, 
于 2013-01-10T16:05:49.047 に答える
0

これは、それらを順番にグループに配置する場合に機能します(つまり、{1、2}、{3、4}、{5、6}、{7、8}、{9、10}、{11、12}、{ 13、14}、{15、16}、{17、18}、{19、20}、{21}):

    int groupSize = items.Length / 10;
    string[][] sets = items.Select((str, idx) => new { index = idx, value = str })
                           .GroupBy(a => a.index / groupSize)
                           .Select(gr => gr.Select(n => n.value).ToArray())
                           .ToArray();

102個のアイテムがある場合、これにより、10個のアイテムの配列が10個、2個のアイテムの配列が1個(残り)になります。これはあなたが期待していることですか?

于 2013-01-10T15:43:15.233 に答える
0

MoreLinqBatch拡張メソッドを使用する:

private String[][] SplitIntoParts(string[] items, int equalPartsCount)
{
   var batches = items.Batch(items.Count() / equalPartsCount);
   return batches.Select(x => x.ToArray()).ToArray();
}
于 2013-01-10T16:08:12.653 に答える
0

List<List<string>>10 または 11 (実際に必要な数値) を含むs を作成し、List<string>次のようにします。

int i = 0;
int index;
foreach(string s in src)
{
  index = i % lists.Length; //lists is the List<List<string>>
  lists[index].Add(s);
  i++;
}

もちろん、元のリストに少なくとも 10 個または 11 個の項目がある場合にのみ、10 個または 11 個のリストに分割できます。

于 2013-01-10T15:26:46.827 に答える
0

以下の投稿は、配列を分割するための良い例を示しています。

C# 配列の分割

カスタム分割と中間分割の両方が含まれています。

于 2013-01-10T15:27:38.160 に答える