LINQを使用してList <string>内のすべての文字列を連結します


543

List<string>コレクション項目全体をstring区切り文字で単一に連結する簡単なLINQ式はありますか?

コレクションがではなくカスタムオブジェクトの場合はどうなりstringますか?に連結する必要があると想像してくださいobject.Name


37
なぜstring.Join()ではなくlinqですか?
アラン

14
string.Joinの方が優れていますが、linqによってコードが楽しくなると思います。それが理由かもしれません!
AliErsöz、2009

14
String.Joinは、StringBuilderを使用し、繰り返し連結による固有のO(n ^ 2)パフォーマンスを回避するため、より優れています。
ケネットベレンキー2010年

1
LINQを使用したパフォーマンスの問題?
PreguntonCojoneroCabrón

回答:


525

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)時間が再び来ます。
ケネットベレンキー2010年

2
Aggregateメソッドが表示されない場合は、System.Linqを使用して追加する必要があります。
セドリックギエメット2013年

6
問題は、上記のLinQメソッドが空または単一要素のリストで機能しないことです。
アレクサンダー

2
アイテムが空の場合は、InvalidOperationExceptionをスローします。
2xMax

10
string.joinを使用しないのはなぜですか?Sedatがより良い選択であるとき、急いでいる誰もがこの解決策を選択しないように、Sedatの答えを受け入れてください。
Skychan 2016年

966

.NET 4.0以降のバージョン:

String.Join(delimiter, list);

十分なものです。


91
私はすべてLINQソリューションを使用していますが、これはLINQおよびAggregate()メソッドよりも効率的です。
andleer

17
ずっときれい!私にとってはうまくいきました!string.Join( "、"、accs.Select(x => x.AccountID).ToArray())、
m4tt1mus

32
@KonstantinSalavatov OPがLINQにある必要があることをOPが明確にする前に、私の回答を投稿しました。これは、Googleで「必ずしも必要ではない」LINQソリューションを探しているときに、この答えにぶつかった人には完全に有効です。この回答に関して、その文脈で「役に立たない」は不当です。
セダットカパノグル

7
これはList以外にも使用でき<String>、ToString()メソッドを呼び出します。
Kian 2013

これがデータベースへのクエリである場合は機能しません。メモリでのみ機能します。
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()が必要です。
楽園42 2012年

2
ああ!その最後の過負荷は私が探していたものでした。特定のプロパティを抽出する方法が必要であることは知っていました。:)
Mike Devenney

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、


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));
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.