2
votes

c # obtenir une nouvelle liste d'éléments regroupés entre certains éléments de la liste

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]


1 commentaires

pourquoi ne pas simplement divisé par "et"?


3 Réponses :


2
votes

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();

entrez la description de l'image ici

Notez que si votre entrée comprend des espaces (comme ..., "et", "san antonio", ... ), cela peut nécessiter quelques ajustements.


0 commentaires

2
votes

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
    }


0 commentaires

0
votes

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

 entrez la description de l'image ici


0 commentaires