en c # comment obtenir une nouvelle liste d'éléments regroupés en se situant entre un certain élément. par exemple si ma liste était ['visit', 'houston', 'and', 'san', 'antonio', 'and', 'austin', 'and', 'corpus', 'christi']
et je voulais extraire les villes entre "et" dans une nouvelle liste regroupée entre les "et" afin que les deux noms de mots villes soient dans un groupe ensemble
En python, vous pouvez utiliser itertools mais comment pouvez-vous accomplir ceci en c #?
[['visit', 'houston'], ['san', 'antonio'], ['austin'], ['corpus', 'christi']]
résultats-
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]
3 Réponses :
Combinez-les en une seule chaîne (ou laissez-les ainsi si c'est ainsi qu'ils ont commencé), puis divisez-les par et
et divisez à nouveau chaque sous-chaîne:
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();
Notez que si votre entrée comprend des espaces (comme ..., "et", "san antonio", ...
), cela peut nécessiter quelques ajustements.
Pour cela, vous pouvez utiliser System.Linq.GroupBy avec une petite modification pour ajouter la clé en tant que nombre de "et" précédant le mot donné.
Méthode de groupe:
var input = new[] { "visit", "houston", "and", "san", "antonio", "and", "austin", "and", "corpus", "christi" }; var result = GroupByWord(input, "and");
Méthode d'appel:
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 }
Une approche plus simple utilisant des boucles.
var words = new[] { "visit", "houston", "and", "san", "antonio", "and", "austin", "and", "corpus", "christi" }; var result = GetList(words);
Vous pouvez maintenant faire,
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); } }
Sortie
pourquoi ne pas simplement divisé par "et"?