【问题标题】:Splitting String Array to Multiple Parts将字符串数组拆分为多个部分
【发布时间】:2013-01-10 15:21:09
【问题描述】:

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

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

【问题讨论】:

  • 给定:_____ 预期:______
  • 我不明白?如果你问我给出了什么和期望什么,你可以在方法中看到一个字符串数组被给出,并且期望它被平均分成10个不同的部分
  • @Ramie:我们不知道您有什么要求。某些给定输入的预期输出是多少?
  • 如果您的命名约定是正确的,为什么在 string[] 中有命名为对的东西,如果要成为一对,您肯定会使用 Dictionary&lt;T, T2&gt;
  • @Ramie:你还没有告诉我们给定一些特定输入的预期输出。 “均分”对您来说意味着什么,它可能与其他人的想法不同?否则return new Random().Next() == 1 ? new string[10] : new string[11] 是有效的,考虑到您当前的要求。

标签: c# list sorting arrays


【解决方案1】:

使用余数 % 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 个字符串)

【讨论】:

  • 现在测试这个。例如,如果我在 currTermPairs 数组中有 7 个元素,它会做什么?是将其放入前一个并使其具有 3 个元素还是会为其创建一个全新的数组?
  • 第一个会得到 4,第二个会得到 3(在我的例子中,有两个数组)。
【解决方案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, 

【讨论】:

    【解决方案3】:

    我会说创建一个包含 10 或 11(无论您实际想要哪个数字)List&lt;string&gt;s 的 List&lt;List&lt;string&gt;&gt;,然后执行以下操作:

    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 个列表。

    【讨论】:

      【解决方案4】:

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

      C# Splitting An Array

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

      【讨论】:

      • 更多的是评论/请求重复链接,而不是答案。
      【解决方案5】:

      这适用于按顺序将它们分组(即 {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 个项目的数组(其余部分)。这是你所期待的吗?

      【讨论】:

        【解决方案6】:

        使用MoreLinqBatch扩展方法:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-08-27
          • 1970-01-01
          • 2012-08-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多