2010-08-03 4 views
17

У меня есть массив типа object, который является строками. Я хотел бы преобразовать их в строки. Каким будет самый быстрый способ сделать это?Листинг всего массива объектов в строку

Например: У меня есть это object[] и вы хотите конвертировать его так, что это string[].

ОБНОВЛЕНИЕ: Я думаю, проблема в том, что некоторые объекты на object[] на самом деле являются другими объектами, такими как целые числа. Сначала мне нужно было преобразовать их в строки. Пожалуйста, включите это в свое решение. Благодарю.

+4

говорить об изменении целей-сообщений :) – cristobalito

+0

извините! я не понял, что на самом деле была проблема – Diskdrive

ответ

12

, вероятно, не самый эффективный способ сделать это ... это имеет преимущество работы, когда объекты не обязательно являются строками.

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

Зачем вызывать 'ToString', когда знаете, что объекты в массиве уже строки? Вам просто нужно передать элементы в строку. Кроме того, 'out' является зарезервированным ключевым словом;) –

+0

Вам нужно будет переименовать переменную в @out. – James

+0

@Thomas: thanks - вызов ToString(), чтобы сделать его полезным в целом. Как оказалось, ОП отредактировал свое сообщение, чтобы сказать, что некоторые из элементов могут быть не строковыми типами данных (например, ints), поэтому это все равно обработало бы этот случай. – cristobalito

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

ИЛИ:

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

Длинный путь для ярлыка ... – James

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

или если вы используете ключевое слово var:

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

Cast Использование не будет бросать исключение, если любой из ваших строк равны нулю.

+2

'Cast ()' возвращает 'IEnumerable ', вам нужно будет использовать 'ToArray()' для компиляции. –

+0

@ 0xA3: Да, я обновил свой пост. Однако он не будет генерировать исключение, если OP использует ключевое слово var. – James

+1

Обратите внимание, что версия с 'var' компилирует, но создает' IEnumerable 'вместо строкового массива. –

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

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

Если массив объектов содержит смешанные элементы, которые вы можете использовать ConvertAll метод Array:

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

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

Зачем использовать 'ConvertAll' класса' List', если для «Array» уже реализован один? Проверьте мой ответ, чтобы узнать, как это сделать правильно. –

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

вы можете использовать lambda: Array.ConvertAll (objects, o => o.ToString()); – onof

+0

@onof справа. Или анонимный метод в случае NET2.0 – Arseny

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

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

Сумасшедшее обновление вопроса там ...

0

Вы не можете использовать Enumerable.Cast, если некоторые из объектов в массиве являются целыми числами, то бросят InvalidCastException когда вы сделать это:

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

list.Cast<string>(); 

Вместо этого попробуйте ответить cristobalito, либо синтаксис лямбда-эквивалент:

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

+1 для упоминания малоизвестного метода. Это также, вероятно, немного более эффективно, чем подход LINQ –

0

Поскольку все объекты уже натягивает тяжелую работу произнесения. Более безопасный способ может заключаться в следующем:

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

Эта реализация возвращает всегда массив строк, потенциально пустой. Клиентский код может быть реализован на основе этого предположения, и вам не нужно проверять возвращаемое значение для null.

Смежные вопросы