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
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
quelque chose comme ...
string mystring = string.Join("-", yourlist.Select(o => o.toString()).toArray()));
(Edit: Maintenant son testé et fonctionne très bien)
Si cela fonctionne ... je l'aime. Très court, doux, et au point! –
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
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() –
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!).
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
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
En fait, je pense que c'est ce que vous vouliez. myList.Select (o => o.ToString()). Aggregate ((s1, s2) => s1 + "-" + s2); –
Aggregate est une bonne réponse, mais personnellement, je trouve plus difficile à comprendre qu'un simple string.join() (juste mon préfixe personnel) –
Je deuxième Tim J, c'est comme ça que je préfère le faire. – ccook
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.)
La méthode Aggregate de LINQ devrait le faire, mais je ne connais pas suffisamment la syntaxe C# lambda pour le tester. – CoderDennis
J'ai posté une solution en utilisant Aggregate plus bas. – Charles