C# 简单LINQ查询

C# 简单LINQ查询,c#,.net,linq,generics,C#,.net,Linq,Generics,我有这样的收藏 List<int> {1,15,17,8,3}; 如何通过LINQ查询获得像1-15-17-8-3这样的扁平字符串 谢谢你像 string mystring = string.Join("-", yourlist.Select( o => o.toString()).toArray())); 编辑:现在它已经过测试,工作正常 StringBuilder sb = new StringBuilder(); foreach(int i in collecti

我有这样的收藏

 List<int> {1,15,17,8,3};
如何通过LINQ查询获得像1-15-17-8-3这样的扁平字符串

谢谢你

string mystring = string.Join("-", yourlist.Select( o => o.toString()).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);

像这样的事情也许是我脑子里想出来的那就是

您可以编写一个扩展方法,然后在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
扩展方法实现的示例如下:


使用可枚举。聚合如下:

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-。您可以删除最后一个字符以获得所描述的内容,如果您愿意,您可以在聚合中执行此操作:

string result = intList.Aggregate(string.Empty, (str, nextInt) => str + nextInt + "-", str => str.Substring(0, str.Length - 1));
第一个参数是种子,第二个参数是将执行聚合的函数,第三个参数是选择器-它允许您对聚合值进行最终更改-例如,聚合可以是数值,您希望以格式化字符串的形式返回值

嗯,

-查尔斯最好的答案是

但是,如果您想要一个纯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) : ""
    );

这是上的一个变体,但使用了StringBuilder而不是字符串连接。

如果可以的话……我喜欢它。非常简短,甜蜜,切中要害!这是最好的答案。但是请注意,这里使用的连接方法与LINQ无关,它是一种非常有用的方法,来自于旧的VB6时代……当然,LINQ位只是通过select和toArrayTrue将Int列表转换为字符串数组,但它不回答如何通过LINQ实现这一点。对于字符串,我肯定会使用this或StringBuilder,但看看如何使用LINQ方法将是使用聚合的一个很好的介绍。我的解决方案使用聚合发布了进一步的介绍。下线的聚合方法应该做到这一点,但我不太了解C lambda语法,无法测试它。我发布了一个使用聚合的解决方案。实际上,我认为这正是您想要的。。。myList.Selecto=>o.ToString.Aggregates1,s2=>s1+-+s2;聚合是一个很好的答案,但我个人发现它比一个简单的字符串更难理解。只加入我自己的个人前缀second Tim J,这就是我喜欢的方式。如果列表包含许多元素,那么所有这些字符串连接都会影响性能。您可以使用StringBuilder作为累加器。顺便说一下,如果列表为空,您的第二个版本将引发异常。