简单的LINQ查询

时间:2009-07-07 22:58:24

标签: c# .net linq generics

我有一个像这样的集合

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

如何通过LINQ查询得到像“1-15-17-8-3”这样的扁平字符串?

谢谢

5 个答案:

答案 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而不是字符串连接。)