2009-12-28 12 views
39

Tôi có một System.Array mà tôi cần phải chuyển đổi thành chuỗi []. Có cách nào tốt hơn để làm điều này hơn là chỉ lặp qua mảng, gọi ToString trên mỗi phần tử, và lưu vào một chuỗi []? Vấn đề là tôi không nhất thiết phải biết loại phần tử cho đến khi chạy.Chuyển đổi System.Array thành chuỗi []

+0

Mà không biết các loại cho đến khi thời gian chạy, bạn về cơ bản cần để lặp qua mảng (có thể là với LINQ hoặc bất cứ phương pháp). – GrayWizardx

+0

(đã trả lời nhận xét) –

Trả lời

61

Làm thế nào để sử dụng LINQ?

string[] foo = someObjectArray.OfType<object>().Select(o => o.ToString()).ToArray(); 
+0

Tôi dường như không có quyền truy cập vào phương thức .Select từ Array của tôi. Tui bỏ lỡ điều gì vậy? – KrisTrip

+3

Có, thêm 'System.Linq' vào' using' –

+0

Đảm bảo bạn đang sử dụng C# 3 và bạn đã bao gồm không gian tên System.Linq. – LBushkin

13

Chỉ là Array? Hoặc là nó (ví dụ) object[]? Nếu vậy:

object[] arr = ... 
string[] strings = Array.ConvertAll<object, string>(arr, Convert.ToString); 

Lưu ý hơn bất kỳ 1-d mảng tham chiếu-loại nên bột nhôm để object[] (ngay cả khi nó thực sự là, ví dụ, Foo[]), nhưng giá trị các loại (như int[]) có thể' t. Vì vậy, bạn có thể thử:

Array a = ... 
object[] arr = (object[]) a; 
string[] strings = Array.ConvertAll<object, string>(arr, Convert.ToString); 

Nhưng nếu nó giống như int[], bạn sẽ phải lặp lại theo cách thủ công.

+0

Nó chỉ là Mảng và nó thực sự có thể chứa các loại giá trị (có thể sẽ). – KrisTrip

+0

@KrisTrip - biến * có thể là "chỉ mảng", nhưng đối tượng sẽ không được; nó có một loại mảng nhất định. Ngoài ra còn có sự khác biệt ** lớn ** giữa "chứa các loại giá trị" (mà 'đối tượng []' có thể làm), và "là một mảng kiểu giá trị" (chẳng hạn như 'int []').Sự khác biệt này quan trọng trong trường hợp này. Bạn có thể làm rõ những gì ** chính xác ** dụ 'Array' là? –

+0

Tôi lấy Array bằng cách sử dụng phương thức ToArray. Tôi không biết cho đến khi chạy nhưng nó có thể là int [], double [], float [], string [] hoặc Complex [] (đối tượng do người dùng xác định) – KrisTrip

4

Bạn có thể sử dụng Array.ConvertAll, như thế này:

string[] strp = Array.ConvertAll<int, string>(arr, Convert.ToString); 
0

này có lẽ có thể được nén, nhưng nó được khoảng giới hạn của việc không thể sử dụng Cast <> hoặc LINQ Chọn trên một loại System.Array của vật.

Type myType = MethodToGetMyEnumType(); 
Array enumValuesArray = Enum.GetValues(myType); 
object[] objectValues new object[enumValuesArray.Length]; 
Array.Copy(enumValuesArray, objectValues, enumValuesArray.Length); 

var correctTypeIEnumerable = objectValues.Select(x => Convert.ChangeType(x, t)); 
+0

Vẫn là một mảng các đối tượng chung. –

0

Cách tiếp cận đơn giản và cơ bản;

Array personNames = Array.CreateInstance(typeof (string), 3); 
// or Array personNames = new string[3]; 
personNames.SetValue("Ally", 0); 
personNames.SetValue("Eloise", 1); 
personNames.SetValue("John", 2); 

string[] names = (string[]) personNames; 
// or string[] names = personNames as string[] 

foreach (string name in names) 
    Console.WriteLine(name); 

Hoặc chỉ cần một cách tiếp cận khác: Bạn có thể sử dụng personNames.ToArray quá:

string[] names = (string[]) personNames.ToArray(typeof (string));