en C #, appeler la méthode existe une méthode équivalente pour les listes ou les tableaux? P > Par exemple: P> .split code> scindera une chaîne en une matrice de chaînes en fonction de certains caractères ou de chaîne. 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 Réponses :
Aucun équivalent intégré, mais un éventuellement évalué paresseux serait
Non, il n'y a pas de méthode existante spéciale dans le cadre de séquence scission. P>
Votre code est raisonnable. p>
itinéraires pour améliorer / changer: p>
retour de rendement code> au lieu d'ajouter à sortie code> pour obtenir une évaluation paresseuse. li>
- 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). Li>
- et vous pouvez utiliser
agrégat code> si vous souhaitez afficher le code de déclaration unique ... LI>
ul> 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);
}
}
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 code> est ienumerable list
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 code> Split surbab code> nécessite une forme de revisitage d'un premierB code> 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