Bir ArrayList'ten virgülle ayrılmış bir dizeyi nasıl oluşturabilirim?


84

Hata ayıklama günlüğüne çıkış için virgülle ayrılmış bir liste olarak çıkarmak istediğim bir işlem komut dosyasında bir Kimlik ArrayList'i depoluyorum. Bir şeyleri döngüye sokmadan bunu kolayca yapabilmemin bir yolu var mı?

DÜZENLEME: .net 2.0 ve üzeri sürümlerde bulunan Listeyi (T) işaret ettiği için Joel'e teşekkürler. Bu, varsa TONS daha kolay hale getirir.


Bir ArrayList kullandığınız için .Net 1.0 mı yoksa .Net 1.1 mi kullanıyorsunuz?
kͩeͣmͮpͥ ͩ

Yanıtlar:


161

Evet, kendi sorumu yanıtlıyorum, ancak henüz burada bulamadım ve bunun oldukça kaygan bir şey olduğunu düşündüm:

... VB.NET'te:

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

... C # içinde

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

Bunları "yakalayan" tek şey, Dönüşümün düzgün bir şekilde gerçekleştiğinden emin olmak için Option Strict kullanıyorsanız, ArrayList öğelerinin Strings olarak depolanmış olması gerektiğidir.

DÜZENLEME: .net 2.0 veya üstünü kullanıyorsanız, bir List (Of String) türü nesne oluşturun ve ihtiyacınız olanı elde edebilirsiniz. Bu konuyu gündeme getirdiği için Joel'e çok teşekkürler!

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

2
Başka "aldatma" var. Birincisi, bu çözümün listeyi kendi başınıza dolaşmak kadar deyimsel olmamasıdır. İkinci olarak, ToArray koleksiyonu dolaşırsa ve Join de geçerse, bu basit bir foreach döngüsünden iki kat daha uzun sürer.
Bill the Lizard

Elbette System.Collections.Specialized.StringCollection kullanma imkanı her zaman vardır.
ICR

Yerleşik bir ToArray () yöntemine sahip bir List <string> kullanmayı düşünebilirseniz ve tür sorunlarını ortadan kaldırır. BTW - typeof (string), Type.GetType ("System.String") yerine tercih edilir.
Jon B

17

Şimdiye kadarki çözümlerin hepsi oldukça karmaşık. Deyimsel çözüm şüphesiz şöyle olmalıdır:

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

Yeni çerçeve sürümlerinde süslü akrobasi yapmaya gerek yok. Çok modern olmayan bir versiyon olduğunu varsayarsak, aşağıdakiler en kolayı olacaktır:

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

mspmsp'nin ikinci çözümü de güzel bir yaklaşım ama AddressOfanahtar kelimeyi kaçırdığı için işe yaramıyor . Ayrıca, Convert.ToStringoldukça verimsizdir (birçok gereksiz iç değerlendirme) ve Convertsınıf genellikle çok temiz tasarlanmamıştır. Özellikle tamamen gereksiz olduğu için bundan kaçınma eğilimindeyim.


CType ve CStr aslında Convert sınıfına yapılan çağrılar değil mi?
Joel Coehoorn

@Echostorm: Bunu nerede söyleyebilirim? @Joel: hiç de değil. Çoğu zaman, MS.VB.CS.Conversions.ToStringbasit bir ToStringçağrı ile sonuçlanan yardımcı işlevi çağırırlar . Ancak bu yöntemi bile doğrudan y olarak adlandırmam (VB döküm operatörlerinin aksine).
Konrad Rudolph

16

Gibi bir şey:

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

Temelde bildiğiniz döngüler ...

DÜZENLE

ne dersin:

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

oops .... bu doğru değil ... nasıl hakkında: string.Join (",", Array.ConvertAll <nesne, dizge> (a.ToArray (), Convert.ToString));
mspmsp

8

string.Join(" ,", myArrayList.ToArray()); Bu, .net framework 4.5 ile çalışacaktır.


2

Bir Dizeler listesinden String.Join () kullanılarak virgülle ayrılmış bir dizenin oluşturulmasını gösteren basit bir örnek:

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()

veya

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

Bu çok eski olduğu için güncelleniyor. Tabii ki string kullanmalısınız. Şimdi katılın. Yazma sırasında bir seçenek olarak mevcut değildi.


Vay canına, gerçekten üzgünüm! Sorudaki “C #” etiketini tamamen göz ardı ettim ve yanıtlarınızın geçerli VB kodu olduğunu düşündüm. Yazıklar olsun bana. Ama biz nitelendirirken: ikinci cevabınızın sonuna fazladan bir "" eklenir.
Konrad Rudolph

0

Şimdiye kadar bunun iyi ve hızlı bir çözüm olduğunu buldum

//CPID[] is the array
string cps = "";
if (CPID.Length > 0)
{   
    foreach (var item in CPID)
    {
        cps += item.Trim() + ",";
    }
}
//Use the string cps
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.