2009-12-28 7 views
39

У меня есть System.Array, что мне нужно преобразовать в строку []. Есть ли лучший способ сделать это, чем просто перебирать массив, вызывая ToString для каждого элемента и сохраняя строку []? Проблема в том, что я не обязательно знаю тип элементов до выполнения.Convert System.Array to string []

+0

Без не зная типов до выполнения, то по существу нужно перебирать массив (будь то с помощью LINQ или любым другим способом). – GrayWizardx

+0

(ответил на комментарий) –

ответ

61

Как насчет использования LINQ?

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

У меня нет доступа к методу .Select из моего массива. Я что-то упускаю? – KrisTrip

+3

Да, добавьте 'System.Linq' в свой' using' –

+0

Убедитесь, что вы используете C# 3, и что вы включили пространство имен System.Linq. – LBushkin

13

Это просто Array? Или это (например) object[]? Если это так:

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

Примечание, чем любой 1-d массив референс-типов должно быть литьевой к object[] (даже если это на самом деле, например, Foo[]), но значение-типа (например, int[]) может» t be. Таким образом, вы можете попробовать:

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

Но если это что-то вроде int[], вам придется вручную петли.

+0

Это просто Array, и он может фактически содержать типы значений (вероятно, будет). – KrisTrip

+0

@KrisTrip - * variable * может быть «просто Array», но объект не будет; он имеет определенный тип массива. Существует также ** большая ** разница между «содержать типы значений» (которую 'object []' может делать), а «является массивом типа значений» (например, 'int []').Эта разница имеет значение в этом случае. Можете ли вы уточнить, что именно ** является экземпляром 'Array'? –

+0

Я получаю массив с помощью метода ToArray. Я не знаю до выполнения, но это может быть int [], double [], float [], string [] или Complex [] (объект, определенный пользователем) – KrisTrip

4

Вы можете использовать Array.ConvertAll, например:

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

Это, вероятно, может быть сжат, но он получает обойти ограничение, чтобы не быть в состоянии использовать Cast <> или Linq Выберите на типе System.Array из объект.

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

Все еще массив общих объектов. –

0

Простой и базовый подход;

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

Или просто другой подход: Вы можете использовать personNames.ToArray тоже:

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