2010-08-03 45 views
17

Tôi có một loại kiểu object là chuỗi. Tôi muốn chuyển đổi chúng thành chuỗi. Điều gì sẽ là cách nhanh nhất để làm như vậy?Truyền toàn bộ mảng đối tượng thành chuỗi

Ví dụ: Tôi có số này object[] và muốn chuyển đổi nó thành số này là string[].

CẬP NHẬT: Tôi nghĩ rằng vấn đề là một số đối tượng trên object[] thực sự là các đối tượng khác như số nguyên. Tôi sẽ cần phải chuyển đổi chúng thành chuỗi đầu tiên. Hãy đưa nó vào giải pháp của bạn. Cảm ơn.

+4

nói về việc thay đổi mục tiêu bài đăng :) – cristobalito

+0

xin lỗi! tôi đã không nhận ra đó thực sự là vấn đề – Diskdrive

Trả lời

12

Có lẽ không phải là cách hiệu quả nhất để làm điều đó ... nó có lợi ích của làm việc khi các đối tượng không nhất thiết là chuỗi.

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

Tại sao gọi 'ToString' khi bạn biết rằng các đối tượng trong mảng đã là các chuỗi? Bạn chỉ cần đưa các mục vào 'chuỗi'. Bên cạnh đó, 'out' là một từ khóa dành riêng;) –

+0

Bạn cần đổi tên biến thành @out. – James

+0

@Thomas: cảm ơn - gọi ToString() để làm cho nó có thể sử dụng nói chung. Khi nó quay ra, OP đã chỉnh sửa bài đăng của mình để nói rằng một số phần tử có thể là các loại dữ liệu không phải chuỗi (ví dụ: int), do đó, điều này vẫn sẽ xử lý trường hợp đó. – cristobalito

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

OR:

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

Cách dài cho một phím tắt ... – James

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

hoặc nếu bạn đang sử dụng var keyword:

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

Sử dụng Cast sẽ không ném một ngoại lệ nếu có các chuỗi của bạn là null.

+2

'Cast ()' trả về một 'IEnumerable ', bạn sẽ phải sử dụng 'ToArray()' để thực hiện việc biên dịch này. –

+0

@ 0xA3: Vâng tôi đã cập nhật bài đăng của mình. Tuy nhiên, nó sẽ không ném một ngoại lệ nếu OP đang sử dụng từ khóa var. – James

+1

Lưu ý rằng phiên bản có biên dịch 'var' nhưng tạo một' IEnumerable 'thay vì một mảng chuỗi. –

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

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

Nếu mảng đối tượng của bạn chứa các yếu tố hỗn hợp, bạn có thể sử dụng phương pháp ConvertAll của Array:

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

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

Tại sao lại sử dụng 'ConvertAll' của lớp' List' khi đã có một lớp được triển khai cho 'Mảng'? Kiểm tra câu trả lời của tôi để xem cách thực hiện nó đúng cách. –

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

bạn có thể sử dụng lambda: Array.ConvertAll (objects, o => o.ToString()); – onof

+0

@onof right. Hoặc một phương pháp vô danh trong trường hợp của NET2.0 – Arseny

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

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

Điên câu hỏi cập nhật có ...

0

Bạn không thể sử dụng Enumerable.Cast nếu một số đối tượng trong mảng là các số nguyên, nó sẽ ném InvalidCastException khi bạn làm điều này:

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

list.Cast<string>(); 

Thay vào đó, hãy thử câu trả lời của cristobalito hoặc cú pháp lambda tương đương:

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

+1 để đề cập đến một phương pháp ít được biết đến. Nó cũng có thể hiệu quả hơn một chút so với cách tiếp cận LINQ –

0

Vì tất cả các đối tượng đều đã làm việc khó. Một cách an toàn hơn có thể được sử dụng như sau:

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[] {}; 
    } 

Việc triển khai này luôn luôn là một mảng chuỗi, có khả năng trống. Mã phía máy khách có thể được thực hiện dựa trên giả định đó và bạn tránh phải kiểm tra giá trị trả về cho null.

Các vấn đề liên quan