2009-07-07 7 views
0

J'ai une collection comme çarequête simple LINQ

List<int> {1,15,17,8,3}; 

comment obtenir une chaîne plate comme "1-15-17-8-3" par requête LINQ?

merci

+1

La méthode Aggregate de LINQ devrait le faire, mais je ne connais pas suffisamment la syntaxe C# lambda pour le tester. – CoderDennis

+0

J'ai posté une solution en utilisant Aggregate plus bas. – Charles

Répondre

9

quelque chose comme ...

string mystring = string.Join("-", yourlist.Select(o => o.toString()).toArray())); 

(Edit: Maintenant son testé et fonctionne très bien)

+0

Si cela fonctionne ... je l'aime. Très court, doux, et au point! –

+1

Ceci est la meilleure réponse.Notez cependant que la méthode Join utilisée ici n'a rien à voir avec LINQ, c'est une méthode très utile du bon vieux VB6 jours .... – andy

+0

Bien sûr, le bit linq est juste la conversion de la liste Int en un tableau de chaînes via a select et a toArray() –

0
StringBuilder sb = new StringBuilder(); 

foreach(int i in collection) 
{ 
    sb.Append(i.ToString() + "-"); 
} 

string result = sb.ToString().SubString(0,sb.ToString().ToCharArray().Length - 2); 

Quelque chose comme ça peut-être (du haut de ma la tête c'est!).

1

Vous pouvez écrire une méthode d'extension puis appelez .ToString ("-") sur votre type d'objet IEnumerable comme indiqué ici:

int[] intArray = { 1, 2, 3 }; 
Console.WriteLine(intArray.ToString(",")); 
// output 1,2,3 

List<string> list = new List<string>{"a","b","c"}; 
Console.WriteLine(intArray.ToString("|")); 
// output a|b|c 

Exemples de mise en œuvre de la méthode d'extension sont ici:

http://coolthingoftheday.blogspot.com/2008/09/todelimitedstring-using-linq-and.html http://www.codemeit.com/linq/c-array-delimited-tostring.html

1

Utilisez Enumerable.Aggregate comme ceci:

var intList = new[] {1,15,17,8,3}; 

string result = intList.Aggregate(string.Empty, (str, nextInt) => str + nextInt + "-"); 

Ceci est la manière standard "LINQy" de le faire - ce que vous voulez, c'est l'agrégat. Vous utiliseriez le même concept si vous étiez en train de coder dans une autre langue, disons Python, où vous utiliseriez reduce().

EDIT: Vous obtiendrez "1-15-17-8-3-". Vous pouvez élaguer le dernier caractère pour obtenir ce que vous décrivez, et vous pouvez le faire à l'intérieur de granulats(), si vous souhaitez:

string result = intList.Aggregate(string.Empty, (str, nextInt) => str + nextInt + "-", str => str.Substring(0, str.Length - 1)); 

Le premier argument est la graine , la deuxième est la fonction qui va effectuer l'agrégation, et le troisième argument est votre selector - il vous permet de faire une dernière modification à la valeur agrégée - à titre d'exemple, votre agrégat pourrait être une valeur numérique et vous voulez retourner la valeur en tant que chaîne formatée.

HTH,

-Charles

+1

En fait, je pense que c'est ce que vous vouliez. myList.Select (o => o.ToString()). Aggregate ((s1, s2) => s1 + "-" + s2); –

+0

Aggregate est une bonne réponse, mais personnellement, je trouve plus difficile à comprendre qu'un simple string.join() (juste mon préfixe personnel) –

+0

Je deuxième Tim J, c'est comme ça que je préfère le faire. – ccook

0

La meilleure réponse est given by Tim J.

Cependant, si vous vouliez une solution pure LINQ puis essayer quelque chose comme ça (beaucoup plus à taper, et beaucoup moins lisible que la réponse de Tim J):

string yourString = yourList.Aggregate 
    (
     new StringBuilder(), 
     (sb, x) => sb.Append(x).Append("-"), 
     sb => (sb.Length > 0) ? sb.ToString(0, sb.Length - 1) : "" 
    ); 

(Ceci est une variation sur Charles's answer, mais utilise une StringBuilder plutôt qu'une concaténation de chaîne.)