2010-01-15 5 views
3

je la méthode d'extension suivante qui prend une liste et il se transforme en une virgule chaîne séparée:Comment convertir ce morceau de code en Generics?

static public string ToCsv(this List<string> lst) 
    { 
     const string SEPARATOR = ", "; 
     string csv = string.Empty; 

     foreach (var item in lst) 
      csv += item + SEPARATOR; 

     // remove the trailing separator 
     if (csv.Length > 0) 
      csv = csv.Remove(csv.Length - SEPARATOR.Length); 

     return csv; 
    } 

Je veux faire quelque chose d'analogue, mais l'appliquer à une liste (au lieu de liste de chaînes), cependant, le compilateur ne peut pas résoudre pour T:

static public string ToCsv(this List<T> lst) 
    { 
     const string SEPARATOR = ", "; 
     string csv = string.Empty; 

     foreach (var item in lst) 
      csv += item.ToString() + SEPARATOR; 

     // remove the trailing separator 
     if (csv.Length > 0) 
      csv = csv.Remove(csv.Length - SEPARATOR.Length); 

     return csv; 
    } 

Que manque-t-il?

+0

FWIW, Votre code CSV est mauvais; vous devez mettre des citations autour du texte au format CSV, dans certains cas. –

+0

il n'a pas dit qu'il voulait un fichier formulé "CSV", juste une chaîne d'une liste de valeurs –

Répondre

8

En premier lieu, la déclaration de méthode doit être:

public static string ToCsv<T>(this List<T> list) { // } 

Notez que la méthode doit être paramétré; c'est le <T> après le nom de la méthode. Deuxièmement, ne réinventez pas la roue. Il suffit d'utiliser String.Join:

public static string ToCsv<T>(this IEnumerable<T> source, string separator) { 
    return String.Join(separator, source.Select(x => x.ToString()).ToArray()); 
} 

public static string ToCsv<T>(this IEnumerable<T> source) { 
    return source.ToCsv(", "); 
} 

Notez que je suis allé sauvage porc et généralisé le procédé en acceptant une IEnumerable<T> au lieu d'un List<T>.

Dans .NET 4.0, vous pourrez dire:

public static string ToCsv<T>(this IEnumerable<T> source, string separator) { 
    return String.Join(separator, source.Select(x => x.ToString()); 
} 

public static string ToCsv<T>(this IEnumerable<T> source) { 
    return source.ToCsv(", "); 
} 

C'est, nous ne demandons pas de convertir le résultat de source.Select(x => x.ToString()) à un tableau.

Enfin, pour un article de blog intéressant sur ce sujet, voir l'article d'Eric Lippert Comma Quibbling.

+0

mon Dieu, certaines des solutions dans les commentaires sont baroques. – Jimmy

+0

"baroque" ou "cassé"? –

7

Essayez de changer la déclaration à

static public string ToCsv<T>(this List<T> lst){ ... 
3

Votre fonction a besoin d'un paramètre générique:

static public string ToCsv<T>(this List<T> lst) 
          ^^^ 
2

Vous pouvez rendre plus générique et utiliser IEnumerable au lieu d'une liste < T>, après tout ce que vous n'utilisez pas des méthodes spécifiques à la liste

public static string ToCsv<T>(this IEnumerable lst); 
Questions connexes