List <int>をコンマ区切りの文字列に変換する


116

リストを取得してコンマ区切りの文字列に変換する方法はありますか?

ループしてビルドできることはわかっていますが、どういうわけか、皆さんの中にはもっとクールな方法だと思いますか?

私は本当にこれらのタイプの「トリック」を学びたいので、使用する方法について説明するか、ドキュメントにリンクしてください。

回答:


189
List<int> list = ...;
string.Join(",", list.Select(n => n.ToString()).ToArray())

7
要素ごとに1つの文字列を割り当てるため、巧妙ですが低速で肥大化します。StringBuilderを使用する方がはるかに効率的です。
Steven Sudit、2009年

3
私がオンラインで見たものから(クイック検索)String.Joinは、StringBuilderを使用するよりも高速です。
Yuriy Faktorovich、2009年

3
stackoverflow.com/questions/585860/…、あなたは間違っていますSteven
Yuriy Faktorovich 09/10/23

6
StevenはString.Joinではなくn.ToString()の部分を参照していると思います。
ラルセナル2009年

9
Larsenal:しかし、StringBuilder.Append(Int32)は内部的に整数のToStringを内部的に呼び出します。StringBuilderは、各要素に文字列を割り当てるコストを魔法のように回避しません。見えないところにうまく組み込めます。
itowlson 2009年

115

簡単な解決策は

List<int> list = new List<int>() {1,2,3};
string.Join<int>(",", list)

私はコードでちょうどそれを使用して、素晴らしく機能しました。


1
感謝!これは美しいアプローチです
Irfan Ashraf

2
これは、受け入れられた回答よりも優れたアプローチです。このアプローチでは、Linqをインポートする必要がなく、これはより高速です。
JoKeRxbLaCk

涼しい!stringを知りませんでした。Joinには一般的なオーバーロードがあります。ありがとう。
mrmashal


6

この問題のもう少し複雑なバージョンの約1兆兆のソリューションについては、その多くが遅く、バグが多く、コンパイルもされません-この件に関する私の記事へのコメントを参照してください:

http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx

StackOverflowの解説:

エリックリッペルトの挑戦「コンマquibbling」、ベストアンサー?


リンクをありがとう。この文字列連結の問題は、思ったよりも複雑で、教育的であることがわかりました。
Steven Sudit、2009年

4

さらにクールにするために、これをIEnumerable <T>の拡張メソッドにして、どのIEnumerableでも機能するようにします。

public static class IEnumerableExtensions {
  public static string BuildString<T>(this IEnumerable<T> self, string delim = ",") {
    return string.Join(delim, self)        
  }
}

次のように使用します。

List<int> list = new List<int> { 1, 2, 3 };
Console.WriteLine(list.BuildString(", "));

2つの可能な最適化:1)各項目の後に関係なくデリミタを追加し、ループの終了後に余分なものを削除します。2)StringBuilderの容量を指定します。
Steven Sudit、2009年

1
リフレクターを掘り下げると、Joinが長さを合計してバッファーサイズを事前に計算し、ループの外側に最初の文字列を追加し、次にループの内側で無条件に区切り文字を次の文字列。いくつかの安全でない/内部のトリックと組み合わせると、非常に高速になるはずです。
Steven Sudit、2009年

@Steven:あなたのアドバイスに従いました。
cdiggins

1
拡張で区切り文字をハードコーディングし、渡された区切り文字の値を無視し、セミコロンを逃しました。それはあるはずですreturn string.Join(delim, self);
Andrew

1

かなり速いようです。

IList<int> listItem = Enumerable.Range(0, 100000).ToList();
var result = listItem.Aggregate<int, StringBuilder, string>(new StringBuilder(), (strBuild, intVal) => { strBuild.Append(intVal); strBuild.Append(","); return strBuild; }, (strBuild) => strBuild.ToString(0, strBuild.Length - 1));

1

私の「賢い」エントリ:

        List<int> list = new List<int> { 1, 2, 3 };
        StringBuilder sb = new StringBuilder();
        var y = list.Skip(1).Aggregate(sb.Append(x.ToString()),
                    (sb1, x) =>  sb1.AppendFormat(",{0}",x));

        // A lot of mess to remove initial comma
        Console.WriteLine(y.ToString().Substring(1,y.Length - 1));

コンマを条件付きで追加する方法がわからないだけです。


1
Selectラムダに副作用を書かないでください。この場合、あなたもを使用していないyので、あなたSelectは本質的に単なるa foreachなので、そのように書いてください。
Pavel Minaev

私はこれを良い解決策として提案していませんでした。OPはforeachよりも面白いものを求めていました。
ラルセナル2009年

ええ、でも、「おもしろい」を超えて「虐待」にまで悪用するSelectことforeachは。ここではより興味深いアプローチが使用するだろうEnumerable.AggregateとのStringBuilder試みをすることを-シード値として。
Pavel Minaev

良いアイデア。私は外に出なければならないが、私はそれを旋回するかもしれない。
ラルセナル2009年

0

System.Linqライブラリを使用できます。より効率的です:

using System.Linq;
string str =string.Join(",", MyList.Select(x => x.NombreAtributo));
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.