C#List <string>を区切り文字付きの文字列に


631

一部のコレクションを文字列にすばやく変換し、区切り文字で値を分離するC#の関数はありますか?

例えば:

List<string> names -> string names_together = "John, Anna, Monica"

回答:


1201

使用できますString.Join。あなたが持っている場合は、最初にList<string>呼び出すことができますToArray

List<string> names = new List<string>() { "John", "Anna", "Monica" };
var result = String.Join(", ", names.ToArray());

.NET 4では、あなたは必要としないToArrayのオーバーロードがあるので、もうString.Joinそれは取りますIEnumerable<string>

結果:


ジョン、アンナ、モニカ


95

必要に応じて、これをlinqで行うこともできます

var names = new List<string>() { "John", "Anna", "Monica" };
var joinedNames = names.Aggregate((a, b) => a + ", " + b);

Quartermeisterの回答ではlinq以外の構文を好んでいますAggregateが、パフォーマンスが低下する可能性があると思います(おそらくより多くの文字列連結演算)。


19
迅速な返信をありがとう、どちらも問題なく動作します。あなたは正しいです。Stopwatchクラスを使用して小さなパフォーマンス測定を実行しましたが、linq-wayははるかに遅くなります。String.Join( "、"、names.ToArray()); -> 18ティックを取ったAggregate((a、b)=> a + "、" + b)-> 736ティックを取った
nan

2
ええ、私Aggregateは数学タイプの演算に適していると思います。文字列を使用したこの操作for eachは、リストに存在する各アイテムに対して新しい文字列を作成するため、非効率で非常に遅い文字列にingおよび追加するのと同じです。
ボブ

コンテナが空の場合、シード値のないAggregateはInvalidOperationExceptionをスローすることに注意してください。シードバージョンのAggregate(seed、func)を使用して、エラー処理コードや条件付きチェックを回避します。String.Joinは空をスローしないため、シードや追加のコードは必要ありません。さらに、Linqは必要なく、構文は少し明確です。
Huacanacha 2015年

1
上記の例の集計は、StringBuilderを使用すると、より速く機能する場合があります。「+」を使用して複数の連結を実行することはお勧めしません。こちら(msdn.microsoft.com/en-us/library/…)の「解説」セクションを参照してください
Ilya Denisov
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.