如何在一个循环中解析字符串中的两列?

时间:2017-04-06 14:27:59

标签: c# arrays string split

我有一个像这样的字符串。我想把第二行放在一个数组(3,9,10,11 ...)中,第三行(5,8,4,3 ...)放在一个数组中

C8|   3|   5|  0|     |  0|1|  
C8|   9|   8|  0|     |  0|1|  
C8|  10|   4|  0|     |  0|1|  
C8|  11|   3|  0|     |  0|1|  
C8|  12|   0|  0|     |  0|1|  
C8|  13|   0|  0|     |  0|1|  
C8|  14|   0|  0|     |  0|1|

此方法最初按行解析数字。现在我有专栏.. 如何在这个Parse方法中做到这一点?我想要几个小时,我不知道该怎么做。

Add方法等待2整数。 int secondNumberFinal,int thirdNumberFinal

private Parse(string lines)
{
        const int secondColumn = 1;
        const int thirdColum = 2;

        var secondNumbers = lines[secondColumn].Split('\n'); // i have to split by new line, right?
        var thirdNumbers = lines[thirdColum].Split('\n'); // i have to split by new line, right?

        var res = new Collection();

        for (var i = 0; i < secondNumbers.Length; i++)
        {
            try
            {
                var secondNumberFinal = Int32.Parse(secondNumbers[i]);
                var thirdNumberFinal = Int32.Parse(thirdNumbers[i]);

                res.Add(secondNumberFinal, thirdNumberFinal);
            }
            catch (Exception ex)
            {
                log.Error(ex);
            }
        }

        return res;
    }
谢谢你!

2 个答案:

答案 0 :(得分:1)

下面的代码应该为你做。逻辑很简单:使用'\ n'拆分数组(请检查是否需要“\ r \ n”或其他行结束格式),然后用“|”拆分。将数据作为元组的IEnumerable返回将提供灵活性和延迟执行。如果您希望使用Enumerable.ToList扩展方法

,可以将其转换为调用者的列表

它使用LINQ(Select),而不是foreach循环,因为它在这种情况下很优雅

static IEnumerable<Tuple<int, int>> Parse(string lines) {
    const int secondColumn = 1;
    const int thirdColum = 2;

    return lines.Split('\n')
        .Select(line => line.Split('|'))
        .Select(items => Tuple.Create(int.Parse(items[secondColumn]), int.Parse(items[thirdColum])));
}

答案 1 :(得分:0)

如果原始字符串是单个字符串,则在换行符上拆分一次以生成字符串数组。通过拆分|来解析每个新字符串&安培;选择第二个&amp;第三个值。

为您部分重写您的方法:

private Parse(string lines)
{
  const int secondColumn = 1;
  const int thirdColum = 2;

  string [] arrlines = lines.Split('\r');
  foreach (string line in arrlines)
  {
    string [] numbers = line.Split('|');

    var secondNumberFinal = Int32.Parse(numbers[secondNumbers]);
    var thirdNumberFinal = Int32.Parse(numbers[thirdNumbers]);

    // Whatever you want to do with them here

  }
}