【问题标题】:How to get the ever first five character of a string with separator如何使用分隔符获取字符串的前五个字符
【发布时间】:2020-11-03 11:57:20
【问题描述】:

从此一整串;

"1;2;3;4;5;2;2;2;2;2;3;3;3;3;3;4;4;4;4;4;5;5;5;5;5"

我怎样才能实现这样的放入数组;

我想将它们逐行放入一个数组中。

【问题讨论】:

标签: c#


【解决方案1】:

您可以将结果作为字符串与row 提到的预期结果一样

string input = "1;2;3;4;5;2;2;2;2;2;3;3;3;3;3;4;4;4;4;4;5;5;5;5;5";
input = input + ";";
int columnNumber = 5;
List<string> result = new List<string>();
for (int columnIndex = 0; columnIndex < columnNumber; columnIndex++)
{
    StringBuilder row = new StringBuilder();
    for (int i = columnIndex * 2; i < input.Length; i+= columnNumber * 2)
    {
        row.Append(input.Substring(i, 2));
    }
    row.Remove(row.Length - 1, 1);
    result.Add(row.ToString());
}
Assert.AreEqual("1;2;3;4;5", result[0]);
Assert.AreEqual("2;2;3;4;5", result[1]);

您可以在;, 等结果字符串集合的形式上写信。另外我添加了一些断言来检查结果(你可以删除它)

【讨论】:

    【解决方案2】:

    您可以使用以下代码将字符串分组到数组列表中,每个数组包含来自源字符串的 5 个元素:

     private void Test()
     {
         var str = "1;2;3;4;5;2;2;2;2;2;3;3;3;3;3;4;4;4;4;4;5;5;5;5;5";
         var items = str.Split(';').Select(x => int.Parse(x)).ToList();
         var result = ChunkBy(items, 5);
     }
    
     private List<T[]> ChunkBy<T>(List<T> list, int count)
     {
          var result = new List<T[]>();
    
          var groupsCount = list.Count / count;
    
          while (result.Count < groupsCount)
          {
               result.Add(list.Skip(count * result.Count).Take(count).ToArray());
          }
    
          return result;
    }
    

    【讨论】:

      【解决方案3】:

      使用二维数组:

      var subject = "1;2;3;4;5;2;2;2;2;2;3;3;3;3;3;4;4;4;4;4;5;5;5;5;5";
      var splittedSubject = subject.Split(new[]{';'});
              
      int columns = 3;
      int rows = splittedSubject.Length / columns + 1;
              
      var twoDimArray = new int[columns,rows];
              
      var index = 0;
      foreach(var c in splittedSubject)
      {
          twoDimArray[index % columns, index / columns] = int.Parse(splittedSubject[index]);
          index++;
      }
      

      或者像列表一样:

      int columns = 3;
      List<int>[] list = new List<int>[] { new List<int>(), new List<int>(),new List<int>()};
                      
      var subject = "1;2;3;4;5;2;2;2;2;2;3;3;3;3;3;4;4;4;4;4;5;5;5;5;5";
              
      var splitted = subject.Split(new[]{';'});
      
      var index = 0;
      foreach(var c in splitted)
      {
          list[index % columns].Add(int.Parse(splitted[index]));
          index++;
      }
      

      【讨论】:

        【解决方案4】:

        我假设您的意思是将“前五个字符”放入第一列,接下来的五个放入第二列,依此类推。

        首先将输入字符串转换为包含数字的数组(作为字符串)。

        然后将其转换为整数的二维数组:

        public static int[,] ToMatrix(string input)
        {
            const int Rows = 5;
        
            string[] numbers = input.Split(';');
            int columns = (numbers.Length + Rows - 1) / Rows;
            int[,] matrix = new int[Rows, columns];
        
            int i = 0;
            for (int col = 0; col < columns; col++) {
                for (int row = 0; row < Rows; row++, i++) {
                    // In case numbers.Length is not divisible by 5.
                    if (i >= numbers.Length) return matrix;
        
                    matrix[row, col] = Int32.Parse(numbers[i]);
                }
            }
            return matrix;
        }
        

        您也可以选择不处理输入长度不能被 5 整除的情况并删除多余的数字。那么列号就是:

        int columns = numbers.Length / Rows;
        

        if (i &gt;= numbers.Length) return matrix; 可以被删除。

        【讨论】:

          猜你喜欢
          • 2013-04-03
          • 2012-02-06
          • 1970-01-01
          • 2012-05-19
          • 2013-04-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-02-25
          相关资源
          最近更新 更多