2010-08-03 8 views
17

dizisine dökme Dizelerim olan object türünde bir dizi var. Onları dizgeye dönüştürmek istiyorum. Bunu yapmanın en hızlı yolu ne olurdu?Nesnelerin tüm dizisini

Ör .: Ben bu object[] var ve bunu dönüştürmek istiyorum bu yüzden bu string[].

GÜNCELLEME: Sorun şu ki, object[]'daki bazı nesnelerin aslında tamsayılar gibi başka nesneler olduğunu düşünüyorum. İlk önce dizeleri dönüştürmem gerek. Lütfen bunu çözümünüze dahil edin. Teşekkürler.

+4

Hedef postaları değiştirme hakkında konuşun :) – cristobalito

+0

üzgünüm! Aslında bu sorun oldu anlamadım – Diskdrive

cevap

12

değil bunu yapmak için en etkili yolu ne zaman nesneler zorunlu olarak dizeler değildir.

string[] output = (from o in objectArray 
        select o.ToString()).ToArray() 
+1

Dizideki nesnelerin zaten dizeleri olduğunu bildiğinizde neden "ToString" deyiniz? Sadece öğeleri "string" 'e çevirmeniz yeterlidir. Ayrıca, 'out' ayrılmış bir anahtar sözcüktür;) –

+0

Değişkeninizi @out olarak yeniden adlandırmanız gerekir. – James

+0

@Thomas: teşekkürler - genel olarak kullanılabilir hale getirmek için ToString(). Anlaşıldığı üzere, OP, bazı öğelerin dizgi dışı veri türleri (ör., Ints) olabileceğini söyleyecek şekilde görevini düzenledi, böylece bu durum yine de bu durumu ele alacaktı. – cristobalito

0
string[] str = new string[myObjects.Length]; 
for (int i = 0; i < myObjects.Length; ++i) 
    str[i] = myObjects[i].ToString(); 

VEYA:

List<string> lst = new List<string>(); 
foreach (object o in myObjects) 
    list.Add(o.ToString()); 
return list.ToArray(); 
+1

Kısayol için uzun yol ... – James

3
string[] myStringArray = myObjectArray.Cast<string>().ToArray(); 

veya var anahtar kelime kullanıyorsanız: En dizeleri herhangi boş olup olmadığını Cast istisna atmaz kullanma

var myStringArray = myObjectArray.Cast<string>(); 

. Nesneniz dizisi karışık öğeler varsa

+2

'Cast ()' bir 'IEnumerable ' döndürür, bu derlemeyi yapmak için 'ToArray()' kullanmanız gerekir. –

+0

@ 0xA3: Gönderiyi güncelledim. Ancak, OP var anahtar sözcüğünü kullanıyorsa bir istisna alamaz. – James

+1

"var" olan sürümün, bir dizi dizisi yerine "IEnumerable " oluşturduğunu unutmayın. –

15
object[] data = new object[] { "hello", "world", "!" }; 

string[] stringData = data.Cast<string>().ToArray(); 

Eğer Array ait ConvertAll yöntemi kullanabilirsiniz: o çalışma yararı vardır ... Muhtemelen

object[] data = new object[] { "hello", 1, 2, "world", "!" }; 

string[] stringData = Array.ConvertAll<object, string>(data, o => o.ToString()); 
+2

Zaten "Array" için uygulanan bir "List" sınıfının 'ConvertAll 'özelliğini kullanalım? Nasıl düzgün yapılacağını görmek için cevabımı kontrol edin. –

1
object[] objects; 
.. 
string[] result = Array.ConvertAll(objects, 
     new Converter<object, string>(Obj2string)); 
public static string Obj2string(object obj) 
{ 
    return obj.ToString(); 
} 
+2

lambda kullanabilirsiniz: Array.ConvertAll (object, o => o.ToString()); – onof

+0

@onof right. Ya da bilinen bir yöntemden bahsetmek için NET2.0 – Arseny

0
object[] data = new object[] { "hello", "world", 1, 2 }; 

string[] strings = data.Select(o => o == null ? null : o.ToString()).ToArray(); 

orada Çılgın soru güncelleme ...

0

Dizideki nesnenin bazı tam sayı ise zaman, bu InvalidCastException edeceğiz enumerable.Cast kullanamazsınız Bunun yerine

var list = new object[] { "1", 1 }; 

list.Cast<string>(); 

Cristobalito cevabını deneyin veya lambda sözdizimi eşdeğeri: bunu yapmak

tüm nesneler yana
list.Select(o => o.ToString()).ToArray(); 
13
string[] output = Array.ConvertAll(objects, item => item.ToString()); 
+0

+ 1 durumunda anonim bir yöntem. Ayrıca muhtemelen LINQ yaklaşımından biraz daha verimli –

0

zaten sert döküm işi dizeleri vardır. Aşağıdaki yöntemi kullanarak daha güvenli bir yol:

private static void Conversions() 
    { 
    var strings = Convert(new object[] {"a", "b"}); 
    var strings2 = Convert(new object[] {}); 
    } 

    private static string[] Convert(IEnumerable<object> objects) 
    { 
    return objects as string[] ?? new string[] {}; 
    } 

Bu uygulama, her zaman potansiyel olarak boş bir dizi dizisi döndürür. Müşteri tarafı kodu, bu varsayıma dayalı olarak uygulanabilir ve null için dönüş değerini kontrol etmek zorunda kalmazsınız.