6
votes

Pousser une chaîne délimitée dans une liste

Si j'ai par exemple la chaîne suivante:

"" 123; 3344; 4334; 12 " p>

et je veux ces numéros dans une liste générique code> , Je suppose que je ne connais pas d'une bonne façon ici autre que de scinder une boucle et de faire une conversion, puis ajoutez à une liste code> à travers chaque itération. Quelqu'un a-t-il d'autres moyens d'aller à ce sujet? P>

mis à jour. Voici ce que je suis venu avec. Je veux faire cela la voie de la vie ancienne, pas avec Linq parce que j'essaie d'aller mieux avec des cordes, des tableaux, des listes et de la manipulation et de la conversion en général. P>

list.AddRange(str.Split(';').Select(Int32.Parse));


1 commentaires

Utilisation de Tryparse Voici une erreur sérieuse: en.wikipedia.org/wiki/gigo


5 Réponses :


5
votes
string str = "123;3344;4334;12";
List<int> list = new List<int>();

foreach (string s in str.Split(';'))
{
    list.Add( Int32.Parse(s));
}

6 commentaires

+1, vous avez lu le titre! Je suggérerais d'utiliser Tryparse au lieu d'analyses.


Je me demande si vous pouvez simplement faire la liste list = "123; 3344; 4334; 12" .split (";"); Je sais que vous pouvez avec un tableau: stress [] liste = "123; 3344; 4334; 12" .Split (";");


@coffee, non. Vous ne pouvez pas convertir implicitement d'un tableau de chaînes à une liste . En outre, il devrait être divisé (';') . Notez la citation unique, car c'est un caractère littéral.


Donc, si Tryparse échoue, NULL est ajouté? Si vous avez la liste.Ajouter (Tryparse ...) et l'analyse échoue est une chose encore ajoutée à la liste?


L'OP n'a-t-il pas dit "autre que de diviser dans une boucle et faire une conversion puis ajouter à une liste "?


@coffeeaddict, vous ne pouvez pas faire list.add (int.tryparse ... Lorsque vous travaillez avec une liste d'INTS car Tryparse renvoie un BOOL. S'il échoue, < Code> null n'est pas ajouté, false fait (et vrai sur le succès).



3
votes
List<int> list = (from numString in "123;3344;4334;12".Split(';') 
                  select int.Parse(numString)).ToList();

0 commentaires

6
votes
class Program
{
    private const int ElementCount = 10000000;

    static void Main(string[] args)
    {
        var str = generateString();
        var stopwatch = new Stopwatch();

        var list1 = new List<int>(ElementCount); 
        var list2 = new List<int>(ElementCount);

        var split = str.Split(';');

        stopwatch.Start();
        list1.AddRange(split
                          .Select(ToInt32OrNull) 
                          .Where(i => i != null) 
                          .Cast<int>());
        stopwatch.Stop();

        TimeSpan nonParallel = stopwatch.Elapsed;

        stopwatch.Restart();

        list2.AddRange(split
                          .AsParallel()
                          .Select(ToInt32OrNull)
                          .Where(i => i != null)
                          .Cast<int>());

        stopwatch.Stop();

        TimeSpan parallel = stopwatch.Elapsed;

        Debug.WriteLine("Non-parallel: {0}", nonParallel);
        Debug.WriteLine("Parallel: {0}", parallel);
    }

    private static String generateString()
    {
        var builder = new StringBuilder(1048576);
        var rnd = new Random();

        for (int i = 0; i < ElementCount; i++)
        {
            builder.Append(rnd.Next(99999));
            builder.Append(';');
        }

        builder.Length--;

        return builder.ToString();
    }

    static int? ToInt32OrNull(string s)
    {
        int value;
        return (Int32.TryParse(s, out value)) ? value : default(int?);
    } 
}

19 commentaires

oui je me demande sur la performance par rapport à la scission standard dans une boucle bien que


@COffeAddict: C'est presque toujours négligible, et il ne devrait être pris en compte que pour le changement s'il est mesuré et jugé un problème. Voici une bonne comparaison récente: Jerrytech.blogspot.com/2010 / 02 / ...


Je ne sais pas que je peux toujours ici, vous pouvez trop subuser Linq également en ce sens qu'il peut commencer à être un porc de PEFORMANCE. Ne dis pas que tu as tort ... oui


Ne devrions-nous pas aussi vérifier qu'il y a d'abord une chaîne vide?


Je me demande si si l'analyse échoue, alors quoi, vous obtenez une exception. Donc, vous devriez envelopper cela dans un essai / prise et le gérer afin de ne pas arrêter votre application. En outre, si j'ai pris le vôtre et essayé d'ajouter Tryparse, comment cela correspondrait-il à cette déclaration?


J'ai eu les mêmes problèmes que j'ai traités à ma manière. Je vais mettre à jour la réponse afin que vous puissiez voir si vous l'aimez ...


Vous êtes un programmeur assez chanceux si votre plus grand problème de performance est une fonction de scission de chaîne. Je ne crois pas que Linq ait des frais généraux significatifs sur les boucles de foresach, il est tout simplement facile pour les programmeurs naïfs de perdre une trace de leur grande complexité lorsqu'ils ne voient pas de nidification.


Euh, je suis en désaccord, cela dépend du contexte et de l'application. Je travaille pour un .com qui obtient 2 millions de hits par mois. La performance est tout et cela ajoute tout au long de l'application. Donc, où que vous puissiez modifier la performance, toujours teck pour la performance. Je ne suis pas un professionnel à la performance, mais je sais qu'une chose est que vous devriez toujours le considérer, quel que soit son "trivial" d'une action que vous effectuez, car globalement ensemble, il aura un impact important. Ou, si je devais travailler pour une entreprise commerciale, les préoccupations de performance à ce degré sont courantes.


@coffeeaddict, je ne suis pas d'accord tout à fait avec votre position sur l'optimisation, car je suis sûr que la plupart des autres développeurs le feraient. Bien sûr, la performance peut être tout, mais devinera où le succès de la performance ne devrait pas être fait à l'avant, et vous l'aurez invariablement fausse, ce qui convient avec un code opaque qui pourrait être beaucoup plus clair. Convient bien, code clairement, puis optimiser uniquement lorsqu'un problème apparaît.


@COffeAddict: Désolé, mais je suis en désaccord. Même à cette échelle, la lisibilité du code et la maintenabilité Trump Millisecondes, surtout quand il est si bon marché de s'échapper.


Je ne dis pas de ne pas utiliser Linq, mais vous devez remettre en question comment les choses fonctionnent derrière l'élégance et doivent toujours analyser et vérifier les choses. Parfois, l'élégance est contraire à la réalisation de la performance.


"Lisibilité du code et maintenabilité Trump Millisecondes" Pas lorsque vous avez besoin d'une page pour charger 2 millions d'utilisateurs de moins de 2 secondes.


"Devinant où le succès de la performance sera ne devrait pas être fait à l'avance" Je ne comprends pas où vous deviendrez. Je viens de "se demander" et je dois le savoir parce que trop de Linq peut être dévastateur de la performance de certaines manières ... Je ne sais pas ce que c'est maintenant comme je ne sais pas assez linq mais que je n'ai certainement pas vu De nombreux développeurs me disent de faire attention à la quantité de LINQ sur votre application et d'équilibrer la quantité de LINQ que vous avez placée.


En outre, je m'interroge sur les déclarations de retour. N'est-ce pas une bonne pratique et il suffit de déboguer lorsque vous retournez de la valeur et de ne pas retourner [cette énorme ligne de code]; ?


Comment pouvez-vous mettre par défaut () ici, juste curieux? Jamais vu cela fait sauf dans une déclaration de cas.


@COffeAddict - "Pas lorsque vous avez besoin d'une page pour charger 2 millions d'utilisateurs de moins de 2 secondes." Je dirais, oui, même alors. De ce que je comprends, il y a un autre grand .com, google.com, qui implémente un protocole appelé "carte / réduction" qui est essentiellement en utilisant une syntaxe déclarative sur une syntaxe impérative. Étant donné qu'elles sont une destination majeure sur Internet, peut-être avec encore plus de 2 m hits / Mo, mais le code de la manière qui laisse la performance à l'échelle, vous pouvez reconsidérer votre perspective. La raison est avec le code déclaratif, vous pouvez laisser des performances à la plate-forme.


@COffeAddict - Notez également que je ne préconise pas l'ignorance de la mise en œuvre: les abstractions fuient et la compréhension des conséquences de la performance de quelque chose est importante. Toutefois, étant donné que le choix de l'algorithme ou de la gestion de données ou de la stratégie d'accès submerge souvent toute prestation de micro-performance, Micro-Perf ne devrait vraiment pas être la première chose à considérer. En tant qu'auteur Renount sur l'ingénierie logicielle, Michael Jackson, a déclaré dans sa première règle sur l'optimisation: ne le faites pas. C2.com/cgi/wiki?rulesOfoptimation


@COffeAddict - Par défaut (T) peut être utilisé n'importe où une valeur de type T est attendu.


@codaizen Je m'abstiendrai de débattre de cela ... c'est l'un de ces débats sans fin sans fin en vue si vous savez ce que je veux dire;)



1
votes
string myString = "123;3344;4334;12";
var ints = new List<int>();
(from s in myString.Split(';')
 select int.Parse()).ToList().ForEach(i=>ints.Add(i));
I've heard .Net 4.0 may have added ForEach to Enumerable<T>, so the ToList might be unnecessary there (can't test).

2 commentaires

Après le tolist , vous avez une liste d'INTS. Le foreach est inutile.


@Matthew Flaschen, d'accord. Ma pensée initiale initiale (et certes percutée) La liste pourrait ne pas être originale et le contenu peut être préservé. c'est-à-dire ajouter les résultats à une liste existante sans remplacement.



-1
votes

Je pense que c'est le plus simple xxx


1 commentaires

-1: Cela ne fonctionne jamais, car vous ne pouvez pas lancer une chaîne à un entier. Vous ne pouvez que l'analyser (en utilisant int.parse () ou int.tryparse () ).