9
votes

Comment puis-je écrire une méthode d'extension générique pour convertir une chaîne délimitée vers une liste?

Nous avons souvent besoin de tourner une chaîne avec des valeurs séparées par un personnage dans une liste. Je veux écrire une méthode d'extension générique qui allumera la chaîne en une liste d'un type spécifié. Voici ce que j'ai jusqu'à présent: xxx

mais je reçois une erreur.

Impossible de convertir le type 'String' en tapez 'T'.

Y a-t-il un meilleur moyen de le faire ou dois-je créer plusieurs méthodes d'extension pour les différents types de listes et faire convert.toint32 () , etc.

Mise à jour

J'essaie de faire des choses comme ceci: xxx

ou xxx


4 commentaires

Pourquoi la méthode générique lorsque le seul type impliqué est une chaîne?


La chaîne doit être convertie en différents types. Les valeurs d'une chaîne pourraient être 1,2,3,4,5 ou true, false, false, true .


Vous devez faire un peu de codage pour ça!


Devez-vous retourner la liste? pourquoi pas itinérable de cette façon, vous obtenez les évaluations de la paresse


4 Réponses :


6
votes

semble que vous puissiez simplement utiliser string.split code> et énumérable.Sélectionnez code>? xxx pré>

mais si vous devez faire une extension, Essayez ceci ... p>

public static List<T> ParseDelimitedList<T>(this string value, string delimiter, Func<string, T> selector)
{
    if (value == null)
    {
        return new List<T>();
    }

    var output = value.Split(new string[] { delimiter }, StringSplitOptions.RemoveEmptyEntries);
    return output.Select(selector).ToList();
}

var list = "1,2,3".ParseDelimitedList(",", s => int.Parse(s));


5 commentaires

Ce n'est pas générique. Il ne retournerait que int .


Battez-moi-moi! @Alexford, il n'a pas besoin d'être générique car l'instruction SELECT vous permettra de fournir votre conversion générique.


Nice, mais peut-être qu'il veut juste une solution générique?


@Luis_Laurent C'est une solution générique. Ne pas réinventer la roue. Il n'y a aucune raison de combiner split et sélectionner en une seule opération. Appelez simplement les deux méthodes de manière indépendante.


Ah je vois ce que tu veux dire. Ne pas utiliser une extension du tout.



6
votes

n'est-ce pas une tâche parfaite pour Linq?

Vous pouvez simplement faire quelque chose comme ce qui suit: P>

"1,2,3,4,5".Split(',').Select(s => Convert.ToInt32(s)).ToList();


0 commentaires

17
votes

convert.changetype fonctionnera Pour les types primitifs et de nombreux cadres (en supposant que les règles d'analyse par défaut sont suffisamment bonnes): xxx

Si vous en avez besoin pour fonctionner pour vos propres types personnalisés, vous devrez les amener à mettre en œuvre le < Un href = "http://msdn.microsoft.com/en-sg/library/system.iconvertible.aspx" rel = "noreferrer"> iconvertible interface.

N'oubliez pas que ce n'est pas assez sophistiqué pour travailler avec des règles de conversion personnalisées ou suffisamment robuste pour faire face à une défaillance correctement (au-delà de jeter une exception et de faire échec de l'opération complète). Si vous avez besoin de prise en charge, fournissez une surcharge qui accepte un TypeConverter ou délégué de conversion (comme dans la réponse de Mike Z).


3 commentaires

+1, Wow ne savait jamais qu'il y avait quelque chose comme convert.changetype


Cela a fonctionné très bien, même si je considère simplement en utilisant le linq droit comme Oliver et P.S.W.g ont suggéré.


J'accepte cela parce que c'est la réponse à la question que j'ai posée, mais en tant qu'ani mentionne, c'est Fickle et probablement mieux d'utiliser la linq droite comme dans la réponse de @ Oliver.



9
votes

Il n'y a pas de moyen intégré pour convertir une chaîne en un type arbitraire t . Votre méthode devrait prendre une sorte de délégué: xxx


0 commentaires