ArrayListからコンマ区切りの文字列を作成するにはどうすればよいですか?


84

デバッグログに出力するためにコンマ区切りのリストとして吐き出したい処理スクリプトにIDのArrayListを保存しています。物事をループすることなくこれを簡単に取得できる方法はありますか?

編集:.net 2.0以降で利用可能なList(Of T)を指摘してくれたJoelに感謝します。それが利用可能であれば、それは物事をトン簡単にします。


ArrayListを使用しているので、.Net1.0または.Net1.1を使用していると思いますか?
ケンプͩ

回答:


161

はい、私は自分の質問に答えていますが、ここではまだ見つけていません。これはかなり巧妙なことだと思いました。

... VB.NETの場合:

String.Join(",", CType(TargetArrayList.ToArray(Type.GetType("System.String")), String()))

... C#で

string.Join(",", (string[])TargetArrayList.ToArray(Type.GetType("System.String")))

これらの唯一の「落とし穴」は、Option Strictを使用して変換が適切に行われるようにする場合、ArrayListに項目を文字列として格納する必要があることです。

編集:.net 2.0以降を使用している場合は、List(Of String)タイプのオブジェクトを作成するだけで、必要なものを入手できます。これを提起してくれたJoelに感謝します!

String.Join(",", TargetList.ToArray())

2
他にも「落とし穴」があります。1つは、このソリューションは、リストを自分でループするほど慣用的ではないということです。次に、ToArrayがコレクションをトラバースし、Joinもトラバースする場合、これには単純なforeachループの2倍の時間がかかります。
トカゲのビル

もちろん、System.Collections.Specialized.StringCollectionを使用する可能性は常にあります。
ICR

代わりにList <string>の使用を検討できる場合は、ToArray()メソッドが組み込まれており、型の問題が解消されます。ところで-typeof(string)はType.GetType( "System.String")よりも望ましいです。
Jon B

17

これまでの解決策はすべて非常に複雑です。慣用的な解決策は間違いなく次のようになります。

String.Join(",", x.Cast(Of String)().ToArray())

新しいフレームワークバージョンでは、派手なアクロバットは必要ありません。それほど現代的ではないバージョンを想定すると、次のことが最も簡単です。

Console.WriteLine(String.Join(",", CType(x.ToArray(GetType(String)), String())))

mspmspの2番目のソリューションも優れたアプローチですが、AddressOfキーワードが欠落しているため機能しません。また、Convert.ToStringかなり非効率的であり(多くの不要な内部評価)、Convertクラスは一般的にあまりきれいに設計されていません。特にそれが完全に冗長であるため、私はそれを避ける傾向があります。


CTypeとCStrは本質的にConvertクラスへの呼び出しではありませんか?
Joel Coehoorn 2008年

@Echostorm:どこで言うの?@ジョエル:まったく違います。ほとんどの場合、MS.VB.CS.Conversions.ToStringヘルパー関数を呼び出すため、単純なToString呼び出しになります。しかし、このメソッドでさえ、(VBキャスト演算子を介するのではなく)直接yを呼び出すことはありません。
Konrad Rudolph

16

何かのようなもの:

String.Join(",", myArrayList.toArray(string.GetType()) );

これは基本的にあなたが知っているループです...

編集

どうですか:

string.Join(",", Array.ConvertAll<object, string>(a.ToArray(), Convert.ToString));

おっと....それは正しくありません...どうですか:string.Join( "、"、Array.ConvertAll <object、string>(a.ToArray()、Convert.ToString));
mspmsp 2008年


2

これは、文字列のリストからString.Join()を使用してコンマ区切りの文字列を作成する方法を示す簡単な例です。

List<string> histList = new List<string>();
histList.Add(dt.ToString("MM/dd/yyyy::HH:mm:ss.ffff"));
histList.Add(Index.ToString());
/*arValue is array of Singles */
foreach (Single s in arValue)
{
     histList.Add(s.ToString());
}
String HistLine = String.Join(",", histList.ToArray());

2
foo.ToArray().Aggregate((a, b) => (a + "," + b)).ToString()

または

string.Concat(foo.ToArray().Select(a => a += ",").ToArray())

これは非常に古いため、更新しています。もちろん、string.Joinを使用する必要があります。これを書いている時点では、オプションとして存在していませんでした。


うわー、本当にごめんなさい!質問の「C#」​​タグを完全に見落とし、あなたの回答は有効なVBコードであると推測しました。恥ずかしい。しかし、私たちが気を悪くしている間、2番目の答えは最後に余分な「、」を追加します。
Konrad Rudolph

0

これまでのところ、これは優れた迅速な解決策であることがわかりました

//CPID[] is the array
string cps = "";
if (CPID.Length > 0)
{   
    foreach (var item in CPID)
    {
        cps += item.Trim() + ",";
    }
}
//Use the string cps
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.