我有一个像这样的集合
List<int> {1,15,17,8,3};
如何通过LINQ查询得到像“1-15-17-8-3”这样的扁平字符串?
谢谢
答案 0 :(得分:9)
类似......
string mystring = string.Join("-", yourlist.Select( o => o.toString()).toArray()));
(编辑:现在已经过测试,工作正常)
答案 1 :(得分:1)
您可以编写扩展方法,然后在IEnumerable对象类型上调用.ToString(“ - ”),如下所示:
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
扩展方法实现的示例如下:
http://coolthingoftheday.blogspot.com/2008/09/todelimitedstring-using-linq-and.html http://www.codemeit.com/linq/c-array-delimited-tostring.html
答案 2 :(得分:1)
像这样使用Enumerable.Aggregate:
var intList = new[] {1,15,17,8,3};
string result = intList.Aggregate(string.Empty, (str, nextInt) => str + nextInt + "-");
这是标准的“LINQy”方式 - 你想要的是聚合。如果您使用另一种语言(例如Python)编写,则可以使用相同的概念,您可以使用reduce()。
编辑: 那会让你“1-15-17-8-3-”。您可以删除最后一个字符以获得您所描述的内容,如果您愿意,可以在Aggregate()内部执行此操作:
string result = intList.Aggregate(string.Empty, (str, nextInt) => str + nextInt + "-", str => str.Substring(0, str.Length - 1));
第一个参数是种子,第二个参数是执行聚合的函数,第三个参数是选择器 - 它允许您进行最后的更改聚合值 - 例如,您的聚合可能是一个数值,您希望将该值作为格式化字符串返回。
HTH,
- 查尔斯
答案 3 :(得分: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);
也许是这样的事情(在我的头顶之外!)。
答案 4 :(得分:0)
最佳答案是given by Tim J。
但是,如果你想要一个纯粹的LINQ解决方案,那就试试这样的事情(更多的打字,比Tim J的回答更不易读):
string yourString = yourList.Aggregate
(
new StringBuilder(),
(sb, x) => sb.Append(x).Append("-"),
sb => (sb.Length > 0) ? sb.ToString(0, sb.Length - 1) : ""
);
(这是Charles's answer的变体,但使用StringBuilder
而不是字符串连接。)