it-roy-ru.com

Преобразовать System.Array в строку []

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

39
KrisTrip

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

string[] foo = someObjectArray.OfType<object>().Select(o => o.ToString()).ToArray();
63
Craig Stuntz

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

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

Обратите внимание, что любой 1-й массив ссылочных типов должен быть преобразован в object[] (даже если это действительно, например, Foo[]), но типы значений (такие как int[]) не могут быть. Так что вы можете попробовать:

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

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

13
Marc Gravell

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

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

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

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));
0
Umut D.

Вероятно, это может быть сжато, но оно обходит ограничение невозможности использования Cast <> или Linq Select для объекта типа 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
bougiefever