7
votes

Existe-t-il une méthode "Liste Split" en C #?

en C #, appeler la méthode .split code> scindera une chaîne en une matrice de chaînes en fonction de certains caractères ou de chaîne.

existe une méthode équivalente pour les listes ou les tableaux? P >

Par exemple: P>

IEnumerable<IEnumerable<T>> Split<T>(IEnumerable<T> list, T divider)
{
    var output = new List<List<T>>();
    var temp = new List<T>();
    foreach ( var item in list )
    {
        if (item.Equals(divider))
        {
            output.Add(temp);
            temp = new List<T>();
        }
        else
        {
            temp.Add(item);
        }
    }

    output.Add(temp);
    return output;
}


3 commentaires

Vous pourrez peut-être faire quelque chose avec index de, bien que je ne sois pas sûr comment cela compare l'égalité en général ...


Sur votre édition - pendant avec un seul séparateur, il est assez simple, ce qui est un code "bon / meilleur", ce n'est pas le cas pour la correspondance de séquences: vous auriez besoin de gérer correctement les ratés lors de la correspondance ( aabbaba Split sur bab nécessite une forme de revisitage d'un premier B pour le renvoyer) avec des compromis différents sur plusieurs approches pour le faire. Il existe également de nombreux algorithmes de correspondance de chaîne différents (ce que vous voulez exactement dans votre édition) qui optimisent pour différents critères. Donc, éditer n'est pas vraiment responsable (au sens du "meilleur").


Dupliqué possible de Groupe par élément de Linq


3 Réponses :


8
votes

Aucun équivalent intégré, mais un éventuellement évalué paresseux serait xxx


0 commentaires

2
votes

Non, il n'y a pas de méthode existante spéciale dans le cadre de séquence scission.

Votre code est raisonnable.

itinéraires pour améliorer / changer:

  • Vous pouvez être en mesure d'utiliser retour de rendement au lieu d'ajouter à sortie pour obtenir une évaluation paresseuse.
  • Avec un code encore plus intéressant, vous pouvez également faire des listes intérieures paresseuses également (ce qui peut être important si la séquence entrante n'est pas liée / des segments trop longs).
  • et vous pouvez utiliser agrégat si vous souhaitez afficher le code de déclaration unique ...

0 commentaires

0
votes

Je ne connais aucune fonction intégrée. Cependant, je envisagerais de faire cela:

public static IEnumerable<List<int>> Split(List<int> list, int delimiter)
{
    var start = 0;
    foreach (var end in list.FindAll(x => x == delimiter).Select(splitter => list.IndexOf(splitter, start)))
    {
        yield return list.GetRange(start, end - start);

        start = end + 1;
    }

    if (start <= list.Count)
    {
        yield return list.GetRange(start, list.Count - start);
    }
}


2 commentaires

Je ne sais pas que c'est vraiment une amélioration par rapport à la méthode de l'OP ... cela pourrait être plus lisible, mais cela nécessite également (?) Multiples passes sur l'entrée.


Et cela ne fonctionnerait pas si la liste est ienumerable non list (à cause de gettrange )