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: mais je reçois une erreur. P> Impossible de convertir le type 'String' en tapez 'T'. P>
blockQuote> 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 J'essaie de faire des choses comme ceci: p> ou p>
convert.toint32 () code>, etc. p > Mise à jour h2>
4 Réponses :
semble que vous puissiez simplement utiliser mais si vous devez faire une extension, Essayez ceci ... p> string.split code> et énumérable.Sélectionnez code>? 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));
Ce n'est pas générique. Il ne retournerait que int code>.
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 code> et sélectionner code> 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.
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();
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"> 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 convert.changetype code> fonctionnera Pour les types primitifs et de nombreux cadres (en supposant que les règles d'analyse par défaut sont suffisamment bonnes): iconvertible code> interface. P> TypeConverter code> ou délégué de conversion (comme dans la réponse de Mike Z). P> P>
+1, Wow ne savait jamais qu'il y avait quelque chose comme convert.changetype code>
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.
Il n'y a pas de moyen intégré pour convertir une chaîne en un type arbitraire t code>. Votre méthode devrait prendre une sorte de délégué:
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 code> outrue, false, false, true code>.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