Как получить только числа из массива строк? - PullRequest
0 голосов
/ 11 января 2019

У меня есть массив строк (items), которые содержат цифры и слова - я извлекаю это из словаря (matches), в котором есть значения int и string. Я хочу получить массив или что-то, что я могу перебрать, который просто содержит числа, отсортирован по номерам, а затем показывает их в консоли.

Я могу довольно легко сделать это для отдельных строк с помощью регулярных выражений, но когда у меня есть массив строк, я не знаю, как это сделать.

Код ниже, см. Комментарии:

var matches = new Dictionary<int, string>();
matches.Add(1, "value1");
matches.Add(2, "value5");
matches.Add(3, "value2");
var items = matches.Values.ToArray();
Array.Sort(items, StringComparer.CurrentCulture);
Regex rgx = new Regex(@"\D");
rgx.Replace(items, ""); //This doesn't work with arrays!
int[] numbers = Array.ConvertAll(items, s => int.Parse(s)); //This doesn't work because my strings still contain letters
foreach (int c in numbers)
{
    Console.WriteLine(string.Format("Number is {0}", c));
    Console.ReadKey();
}

Желаемый вывод:

Number is 1
Number is 5
Number is 2

Если это не очевидно, эти цифры взяты из value1, value5 и value2.

Ответы [ 3 ]

0 голосов
/ 11 января 2019

выполнение этого с List<T> вместо Array будет проще!

var matches = new Dictionary<int, string>();
matches.Add(1, "value1");
matches.Add(2, "value5");
matches.Add(3, "value2");

var items = matches.Values.ToList();
items.Sort( StringComparer.CurrentCulture);
Regex rgx = new Regex(@"\D");
var numbers = items.Select(i => int.Parse(rgx.Replace(i, "")));

foreach (int c in numbers)
{
    Console.WriteLine(string.Format($"Number is {c}"));
}
0 голосов
/ 11 января 2019

Вот пример использования Regex:

            string[] input = { "Number is 1", "Number is 5", "Number is 2" };
            string pattern = @"\d+";

            int[] results = input.Select(x => Regex.Match(x, pattern)).Cast<Match>().Select(x => int.Parse(x.Value)).ToArray();
0 голосов
/ 11 января 2019

Вы можете сделать это с помощью LINQ. Выражение довольно декларативное и самоочевидное:

// we're searching for digits, not removing non-digits as in your example
Regex regex = new Regex(@"\d+");

var results = matches.Values
    .Select(v => regex.Match(v))     // do regex on each item
    .Where(m => m.Success)           // select only those results where regex worked
    .Select(m => int.Parse(m.Value)) // convert to int
    .ToList();                       // convert the results to a list - if you want to sort it

// you wanted to sort the list, right?
results.Sort();

foreach (int number in results)
{
    Console.WriteLine($"Number is {number}");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...