Получить все значения между двумя конкретными значениями в списке - PullRequest
0 голосов
/ 03 июля 2019

У меня есть список символов:

var myList = new List<char>(new[] { 'x', 'y', '(', 'a', 'b', 'c', ')', 'z' });

со значениями:

 'x'
 'y'
 '('
 'a'
 'b'
 'c'
 ')'
 'z' 

Как я могу взять все значения между фигурными скобками? Значения в новом списке должны выглядеть следующим образом:

 'a'
 'b'
 'c'

Индекс скобок в списке может меняться каждый сеанс.

Ответы [ 4 ]

5 голосов
/ 03 июля 2019

Вы можете использовать это выражение LINQ:

myList.SkipWhile(c => c != '(').Skip(1).TakeWhile(c => c != ')')
       ^----- 1 --------------^ ^- 2 -^ ^-------- 3 -----------^
  1. Пропустить, пока мы не найдем (
  2. Пропустить мимо ( мы нашли
  3. Возьмите элементы, пока мы не найдем ) (который не будет включен)

Примечания:

  1. Если последовательность не содержит начальных скобок,будет возвращена пустая последовательность
  2. Если последовательность не содержит соответствующих конечных скобок, остаток последовательность будет возвращена
0 голосов
/ 03 июля 2019
var myList = new List<char>(new[] { 'x', 'y', '(', 'a', 'b', 'c', ')', 'z' });
var start = myList.FindIndex((c) => c == '(');
var end = myList.FindIndex((c) => c == ')');
if (start != -1 && end != -1 && start < end)
{
     var result = myList.GetRange(start + 1, end - start - 1));
}
else
{
    // return null or throw error
}
0 голосов
/ 03 июля 2019

Вы также можете сделать это в несколько шагов:

int start = myList.IndexOf('(') + 1;
int end = myList.IndexOf(')');
var result = myList.Skip(start).Take(end - start).ToList();
0 голосов
/ 03 июля 2019

Вы можете создать цикл, который будет принимать '[' (открытая скобка), если вы его нашли, до тех пор, пока вы не найдете закрывающую скобку ']', чтобы добавить символ в другой массив.

...