将字符串数组拆分为多个部分

时间:2013-01-10 15:21:10

标签: c# list sorting arrays

我可以半信半疑,但是我想要一个干净的方式来做这件事,以后不会产生任何麻烦。

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个不同的字符串数组。我需要确保没有数据丢失并且所有元素都已成功传输

编辑: 你得到一个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

6 个答案:

答案 0 :(得分:5)

使用余数% operator,这里是Linq方法:

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

Demo(每个数组有2个字符串)

答案 1 :(得分:2)

这是一个不使用LINQ的解决方案,以防你想要习惯数组和for循环:

// 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, 

答案 2 :(得分:0)

我想创建一个包含10或11(你真正想要的数字)List<List<string>>的{​​{1}},然后执行以下操作:

List<string>

当然,如果原始列表中至少有10个或11个项目,则只能拆分为10个或11个列表。

答案 3 :(得分:0)

下面的帖子显示了拆分数组的一个很好的例子:

C# Splitting An Array

它包含自定义拆分和中点拆分。

答案 4 :(得分: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个项目的数组(其余部分)。这是你期待的吗?

答案 5 :(得分:0)

使用MoreLinqBatch扩展程序:

private String[][] SplitIntoParts(string[] items, int equalPartsCount)
{
   var batches = items.Batch(items.Count() / equalPartsCount);
   return batches.Select(x => x.ToArray()).ToArray();
}