Разбор запятой разделенной строки парных чисел с CRLF между парами данных - PullRequest
1 голос
/ 28 сентября 2011

Я использую C #. Я изучил примеры и пытался часами. Эта ситуация другая. Я не могу найти решение.

У меня есть длинная строка, полученная с устройства через последовательный порт. Формат строки:

целое число, integerCRLFinteger, integerCRLF

(повторы ...). Заканчивается CRLF.

Если вы показываете эту строку в RichTextBox, она выглядит следующим образом:

2442,6266
7727,2727
6320,272
etc... 

Итак, снова формат строки

TextWhichIsAnInteger, TextWhichIsAIntegerCRLF

(повторы).

Я хотел бы получить его в два массива (или списки) типа int. И, в качестве бонуса, в массив из 2 столбцов или список парных целых. Это сводит меня с ума. Если вы можете помочь предоставить код, я буду полностью признателен и буду поклоняться вам вечно.

Ответы [ 3 ]

2 голосов
/ 28 сентября 2011

Как то так? С макушки моей головы. Непроверенные. Но это должно дать вам идею.

using System.Collections.Generic;

List<int> aTypes = new List<int>();
List<int> aValues = new List<int>();

string sInput = "1234,5678\n9876,4321\n";
// Split by linebreak.
string[] aLinebreaks = sInput.Split('\n');
foreach(string sNumericString in aLineBreaks)
{
  // Split by comma.
  string[] aNumbers = sNumericString.Split(',');
  aTypes.Add(Convert.ToInt32(aNumbers[0]);
  aValues.Add(Convert.ToInt32(aNumbers[1]);
}

...

aTypes.ToArray();
aValues.ToArray();
1 голос
/ 28 сентября 2011

Почему. Заменить на потом. Сплит?

Кроме того, кортежи - отличные инструменты для создания пар.

    string myNumbers = "123,456,789\r\n";
    myNumbers += "123,456,789\r\n";
    var delimiters = new[] {"\r\n"};
    string[] lines = myNumbers.Split(delimiters, StringSplitOptions.None);
    var result = new List<Tuple<int, int>>();
    foreach (var line in lines)
    {
        var integers = line.Split(',');
        result.Add(Tuple.Create(Int32.Parse(integers[0]), Int32.Parse(integers[1])));
    }
0 голосов
/ 28 сентября 2011

Работает ли что-то подобное для вас?

string input = "2442,6266\r\n7727,2727\r\n1234,1234";

string[] numberGroup = input.Replace("\r\n", ":").Split(':');
IDictionary<int,int> numberPairs = new Dictionary<int, int>();
foreach(string str in numberGroup)
{
    string[] pair = str.Split(',');
    numberPairs.Add(Convert.ToInt32(pair[0]), Convert.ToInt32(pair[1]));
}


foreach(int key in numberPairs.Keys)
{
    Console.WriteLine("Number Pair: [{0}]:[{1}]", key, numberPairs[key]);
}

//Output:
//Number Pair: [2442]:[6266]
//Number Pair: [7727]:[2727]
//Number Pair: [1234]:[1234]

EDIT

Если вам не нужны дубликаты, есть такой способ, как указал Пано, но я бы сказал сплиттеру удалить пустые результаты, чтобы он не сработал при одном из вызовов индекса в области конвертации.

string input = "2442,6266\r\n7727,2727\r\n1234,1234";

string[] numberGroup = input.Split(new[]{"\r\n"}, StringSplitOptions.RemoveEmptyEntries);
IList<Tuple<int, int>> numberPairs = new List<Tuple<int, int>>();
foreach(string str in numberGroup)
{
    string[] pair = str.Split(',');
    numberPairs.Add(Tuple.Create(Convert.ToInt32(pair[0]), Convert.ToInt32(pair[1])));
}


foreach(Tuple<int,int> item in numberPairs)
{
    Console.WriteLine("Number Pair: [{0}]:[{1}]",item.Item1, item.Item2);
}
...