使用LINQ在List <string>内连接所有字符串


542

是否有任何简单的LINQ表达式将我的整个List<string>集合项连接到string带有定界符的单个项中?

如果集合是自定义对象而不是该string怎么办?想象我需要串联object.Name


37
为什么是linq而不是string.Join()?
艾伦(Alan)2009年

14
string.Join更好,但我认为linq使您的代码更有趣,这可能就是原因!
阿里·埃索兹(AliErsöz)2009年

14
String.Join更好,因为它使用StringBuilder并避免了重复级联的固有O(n ^ 2)性能。
Kennet Belenky 2010年

1
使用LINQ的性能问题?
PreguntonCojoneroCabrón

Answers:


524

通过使用LINQ,这应该可以工作。

string delimiter = ",";
List<string> items = new List<string>() { "foo", "boo", "john", "doe" };
Console.WriteLine(items.Aggregate((i, j) => i + delimiter + j));

类说明:

public class Foo
{
    public string Boo { get; set; }
}

用法:

class Program
{
    static void Main(string[] args)
    {
        string delimiter = ",";
        List<Foo> items = new List<Foo>() { new Foo { Boo = "ABC" }, new Foo { Boo = "DEF" },
            new Foo { Boo = "GHI" }, new Foo { Boo = "JKL" } };

        Console.WriteLine(items.Aggregate((i, j) => new Foo{Boo = (i.Boo + delimiter + j.Boo)}).Boo);
        Console.ReadKey();

    }
}

这是我最好的:)

items.Select(i => i.Boo).Aggregate((i, j) => i + delimiter + j)

40
O(n ^ 2)时间再次到来。
Kennet Belenky

2
如果看不到Aggregate方法,则需要使用System.Linq;进行添加。
塞德里克Guillemette

6
问题是上述LinQ方法不适用于空列表或单元素列表。
亚历山大

2
如果项目为空,它将抛出InvalidOperationException。
2xMax 2014年

10
为什么不只使用string.join?请接受Sedat的回答,这样当Sedat的选择更好时,任何人都不会急于选择此解决方案。
Skychan

966

在.NET 4.0或更高版本中:

String.Join(delimiter, list);

足够了。


91
我全都支持LINQ解决方案,但这比LINQ和Aggregate()方法更有效。
andleer

17
干净得多!对我来说很棒!string.Join(“,”,accs.Select(x => x.AccountID).ToArray()),
m4tt1mus 2011年

32
@KonstantinSalavatov我在OP澄清它必须在LINQ中之前发布了我的答案。对于在Google上寻找“不必要的LINQ”解决方案时碰到这个答案的任何人,它仍然是完全有效的。在这种情况下,关于该回答“无用”是不公平的。
Sedat Kapanoglu 2012年

7
这也可以用于List以外的其他东西<String>,并将调用ToString()方法。

如果这是去数据库的查询,则不起作用。它仅适用于内存。
alansiqueira27

124

这是一个字符串数组:

string.Join(delimiter, array);

这用于List <string>:

string.Join(delimiter, list.ToArray());

这是自定义对象的列表:

string.Join(delimiter, list.Select(i => i.Boo).ToArray());

25
String.Join有一个需要IEnumerable的重载,因此您不需要ToArray()调用
arolson101

9
请记住,IEnumerable重载仅存在于4.0或更高版本中。如果您使用的是旧版本,则仍然需要ToArray()。
Rakuen42

2
啊! 最后一个过载是我正在寻找的过载。我知道必须有一种提取特定属性的方法。:)
Mike Devenney '16

56
using System.Linq;

public class Person
{
  string FirstName { get; set; }
  string LastName { get; set; }
}

List<Person> persons = new List<Person>();

string listOfPersons = string.Join(",", persons.Select(p => p.FirstName));

26

好问题。我一直在用

List<string> myStrings = new List<string>{ "ours", "mine", "yours"};
string joinedString = string.Join(", ", myStrings.ToArray());

它不是LINQ,但是有效。


为什么必须调用.ToArray()?
ΕГИІИО

因为回溯到2009年糟糕的日子,string.Join没有接受IEnumerable的扩展。
Jacob Proffitt

8
List<string> strings = new List<string>() { "ABC", "DEF", "GHI" };
string s = strings.Aggregate((a, b) => a + ',' + b);

7

我认为,如果您在扩展方法中定义逻辑,则代码将更具可读性:

public static class EnumerableExtensions { 
  public static string Join<T>(this IEnumerable<T> self, string separator) {  
    return String.Join(separator, self.Select(e => e.ToString()).ToArray()); 
  } 
} 

public class Person {  
  public string FirstName { get; set; }  
  public string LastName { get; set; }  
  public override string ToString() {
    return string.Format("{0} {1}", FirstName, LastName);
  }
}  

// ...

List<Person> people = new List<Person>();
// ...
string fullNames = people.Join(", ");
string lastNames = people.Select(p => p.LastName).Join(", ");

6

您可以简单地使用:

List<string> items = new List<string>() { "foo", "boo", "john", "doe" };

Console.WriteLine(string.Join(",", items));

编码愉快!


3

我已经使用LINQ做到了:

var oCSP = (from P in db.Products select new { P.ProductName });

string joinedString = string.Join(",", oCSP.Select(p => p.ProductName));
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.