0
votes

Comment trouver le placement d'une liste dans une autre liste?

Je travaille avec deux listes. Le premier contient une grande séquence de chaînes. La seconde contient une liste de chaînes plus petites. J'ai besoin de trouver où la deuxième liste existe dans la première liste.

J'ai travaillé avec énumération et, en raison de la grande taille des données, c'est très lent, j'espérais une manière plus rapide. xxx

et j'aurais besoin de x à = 2.


1 commentaires

Pouvez-vous nous montrer ce que vous avez essayé jusqu'à présent?


4 Réponses :


-1
votes

Vous pouvez utiliser la méthode d'extension d'intersect à l'aide de l'espace nomoce system.linq xxx


2 commentaires

Cela ne montre que les articles communs aux deux listes. Je cherche de grandes séquences de données à la recherche de modèles.


Je pense que vous demandez quelque chose comme celui-ci faire la commande: Stackoverflow.com/Questtions/28301074/...



0
votes

Méthode somemagique implémentée Comme ci-dessous, cela retournera -1 si aucune correspondance n'a été trouvée, sinon il retournera l'index d'élément de démarrage dans la première liste.

private int SomeMagic(List<string> first, List<string> second)
{
    if (first.Count < second.Count)
    {
        return -1;
    }

    for (int i = 0; i <= first.Count - second.Count; i++)
    {
        List<string> partialFirst = first.GetRange(i, second.Count);
        if (Enumerable.SequenceEqual(partialFirst, second))
            return i;
    }

    return -1;
}


2 commentaires

C'est exactement ce que le médecin a commandé. Merci.


Je recommanderais d'éviter d'utiliser gettrange pour éviter le coût de l'affectation répétée de la liste. prendre serait probablement plus rapide.



1
votes

OK, voici ma variante avec Old-Good-For-Loop:

var first = new List<string> { "AAA","BBB","CCC","CCC","CCC","CCC","EEE","FFF" };
var second = new List<string> { "CCC","CCC","CCC","EEE" };


0 commentaires

1
votes

Si vous êtes prêt à utiliser Morelinq puis envisagez d'utiliser la fenêtre : xxx

fenêtre vous permettra de regarder "tranches" des données en morceaux (basé sur la longueur de votre secondaire liste). Ensuite, séquenceequal peut être utilisé pour voir si la tranche est égale à secondaire . Si c'est le cas, l'index peut être renvoyé. S'il ne trouve pas de correspondance, null sera retourné.


1 commentaires

upvote ceci comme un moyen plus élégant et plus efficace qu'une réponse acceptée