Я использовал C # и хотел бы, чтобы разделенный текст состоял из 3-х двойных чисел, разделенных запятыми и пробелами.

Я сделал:

double[] doubles = mystr.Trim().Split(new char[] { ' ', ',' })
                .Select(s => Convert.ToDouble(s))
                .ToArray();

Когда mystr = 33,44,55, например, он работает нормально (числа разделены только одной запятой)

Кроме того, например, когда mystr = 33 44 55 работает нормально (числа разделены одним пробелом)

НО, когда mystr = 33, 44, 55 это не работает (один пробел после запятой между каждыми двумя числами)

Также не работает, когда mystr = 33 44 55 (два пробела между каждыми двумя числами)

В обоих приведенных выше примерах я получил необработанное исключение.

Как я могу это решить?

Благодарность!

3
Programmer 10 Май 2016 в 14:45

3 ответа

Лучший ответ

Просто попробуйте указать StringSplitOptions и используйте StringSplitOptions.RemoveEmptyEntries для удаления пустых строк ..

    double[] doubles = mystr.Trim().Split(new char[] { ' ', ',' },StringSplitOptions.RemoveEmptyEntries)
            .Select(Convert.ToDouble)
            .ToArray();
0
Hari Prasad 10 Май 2016 в 11:48

Вы можете добавить возможность удаления пустых записей в Сплите:

var array = Array.ConvertAll(mystr.Split(new [] { ' ', ',' },
                             StringSplitOptions.RemoveEmptyEntries),
                             Convert.ToDouble);
10
Ehsan Sajjad 10 Май 2016 в 12:06

Вы можете использовать System.Text.RegularExpressions.Regex:

var pattern = @"(\d+)((,\s*|\s+)|$)";
const int RegexTimeoutSeconds = 1;
var matches = Regex.Matches(mystr, pattern, RegexOptions.None, TimeSpan.FromSeconds(RegexTimeoutSeconds));
var doubles = new List<double>();

foreach (Match match in matches)
{
    var group = match.Groups[1];
    var d = Convert.ToDouble(group.Value);
    doubles.Add(d);
}
1
rory.ap 10 Май 2016 в 13:38