c # получить новый список элементов, сгруппированных между определенным элементом в списке

2

в С#, как вы получаете новый список элементов, сгруппированных путем попадания между определенным элементом. например, если мой список был ["визит", "Хьюстон", "и", "Сан", "Антонио", "и", "Остин", "и", "Корпус", "Кристи"]]

и я хотел извлечь города между "и" в новый список, сгруппированный между "и", чтобы два названия городов назывались в группе

В python вы можете использовать itertools, но как это сделать в С#?

import itertools as itt
    List =['visit', 'houston', 'and', 'san', 'antonio', 'and', 'austin', 'and', 'corpus', 'christi']
    >>> [list(g) for k, g in itt.groupby(L, key=lambda word: word=='and') if not k]

results-

[['visit', 'houston'], ['san', 'antonio'], ['austin'], ['corpus', 'christi']]
  • 0
    почему бы просто не разделить на "и"?
Теги:
linq

3 ответа

2

Для этого вы можете использовать System.Linq.GroupBy с небольшой модификацией, чтобы добавить ключ в виде числа "и", предшествующего данному слову.

Групповой метод:

static string[][] GroupByWord(string[] input, string word)
    {
        var i = 0;
        return input.GroupBy(w =>
        {
            if (w == word)
            {
                i++;
                return -1;
            }
            return i;
        })
        .Where(kv => kv.Key != -1) // remove group with "and" strings
        .Select(s => s.ToArray()) // make arrays from groups ["visit", "houston"] for example
        .ToArray(); // make arrays of arrays
    }

Метод вызова:

        var input = new[] { "visit", "houston", "and", "san", "antonio", "and", "austin", "and", "corpus", "christi" };
        var result = GroupByWord(input, "and");
2

Объедините их в одну строку (или оставьте так, как они начали), затем разделите ее на and снова разделите каждую подстроку:

var words = new[] { "visit", "houston", "and", "san", "antonio", "and", "austin", "and", "corpus", "christi" };

var sentence = string.Join(' ', words);  // "visit houston and san .... christi"

var cities = sentence.Split("and", StringSplitOptions.None)
                     .Select(x => x.Split(' ', StringSplitOptions.RemoveEmptyEntries))
                     .ToArray();

Изображение 174551

Обратите внимание, что если ваш ввод включает в себя пробелы (например, ..., "and", "san antonio",...), то это может потребовать некоторой корректировки.

0

Более простой подход с использованием циклов.

IEnumerable<IEnumerable<string>> GetList(IEnumerable<string> source)
{
    while(source.Any())
    {
        var returnValue = source.TakeWhile(x=>!x.Equals("and")).ToList();
        yield return returnValue;
        source = source.Skip(returnValue.Count()+1);
    }
}

Теперь вы можете сделать,

var words = new[] { "visit", "houston", "and", "san", "antonio", "and", "austin", "and", "corpus", "christi" };
var result = GetList(words);

Выход

Изображение 174551

Ещё вопросы

Сообщество Overcoder
Наверх
Меню