в С#, как вы получаете новый список элементов, сгруппированных путем попадания между определенным элементом. например, если мой список был ["визит", "Хьюстон", "и", "Сан", "Антонио", "и", "Остин", "и", "Корпус", "Кристи"]]
и я хотел извлечь города между "и" в новый список, сгруппированный между "и", чтобы два названия городов назывались в группе
В 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']]
Для этого вы можете использовать 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");
Объедините их в одну строку (или оставьте так, как они начали), затем разделите ее на 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();
Обратите внимание, что если ваш ввод включает в себя пробелы (например, ..., "and", "san antonio",...
), то это может потребовать некоторой корректировки.
Более простой подход с использованием циклов.
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);
Выход