Сократите список до двух меньших списков, используя LINQ (функциональное программирование) - PullRequest
2 голосов
/ 09 апреля 2009

Эй, ребята, я пытаюсь разобраться с LINQ и FP, так что простите, если это наивно. Я пытаюсь выполнить синтаксический анализ строк с помощью LINQ и сопоставления с функцией, поэтому мне нужно разбить мою строку на более мелкие строки.

Я хочу разбить массив на более мелкие списки из двух. Могу ли я использовать Reduce (.Aggregate ()) для этого? Я пытался понять, как применить сокращение, чтобы вернуть список, но мне не повезло.

То, что я хочу, это:

myString.ToCharArray().Take(2)

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

Конкретный пример.

дано (1, 2, 3, 4, 5, 6)

Хочу ((1, 2), (3,4), (5, 6))

уточнить:

учитывая "abcdef"

Я хочу "ab", "cd", "ef"

Приветствую вас, ребята, за помощь.

Ответы [ 2 ]

6 голосов
/ 09 апреля 2009
Enumerable.Range(0, myString.Length)
      .GroupBy(index => index / 2, index => myString[index])
      .Select(eachGroup => new string(eachGroup.ToArray()));

Обратите внимание, что в приведенном выше примере используется тот факт, что у вас есть доступ к коллекции на основе индекса. Чтобы заставить его работать на каждом IEnumerable<T> без этого ограничения:

collection.Select((e,i) => new { Index = i, Element = e })
      .GroupBy(x => x.Index / 2, x => x.Element);
1 голос
/ 09 апреля 2009

Это не похоже на подход, который вы ищете, но это то, что я вижу:

Enumerable.Range(0, myString.Length - 1)
    .Where(i => i % 2 == 0)
    .Select(i => myString.Substring(i, 2).ToCharArray());

Примечание: я думаю, что если у вас нечетное количество символов, подстрока, вероятно, вылетит; Возможно, придется добавить проверку и использовать что-то вроде (myString.Length% 2 == 0? 2: 1), но я не проверял.

Второе примечание: для меня сложность заключается в том, что ваш Reduce на самом деле зависит от индекса массива, а не от значений; Отсюда мое решение перечислять индексы массива и работать оттуда. Другое решение состоит в том, чтобы предоставить метод (я не могу представить себе один встроенный), который перечисляет символы в строке, используя кортеж, содержащий индекс и символ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...