Как создать строку с разделителями-запятыми из ArrayList?

71

Я сохраняю ArrayList идентификаторов в обработке script, которую я хочу выплюнуть в виде списка с разделителями-запятыми для вывода в журнал отладки. Есть ли способ, которым я могу легко это сделать, не зацикливаясь на вещах?

EDIT: Спасибо Джоэлю за указание списка (Of T), доступного в .net 2.0 и выше. Это делает вещи TONS более легкими, если у вас есть это.

  • 0
    Я полагаю, потому что вы используете ArrayList, вы используете .Net 1.0 или .Net 1.1?
  • 0
    stackoverflow.com/questions/799446/...
Теги:
parsing

6 ответов

137
Лучший ответ

Да, я отвечаю на свой вопрос, но я еще не нашел его здесь и подумал, что это довольно гладкая вещь:

... в VB.NET:

String.Join(",", CType(TargetArrayList.ToArray(Type.GetType("System.String")), String()))

... в С#

string.Join(",", (string[])TargetArrayList.ToArray(Type.GetType("System.String")))

Единственным "полученным" для них является то, что ArrayList должен иметь элементы, хранящиеся в виде строк, если вы используете Option Strict, чтобы убедиться, что преобразование происходит должным образом.

EDIT: если вы используете .net 2.0 или выше, просто создайте объект типа List (Of String), и вы можете получить то, что вам нужно. Большое спасибо Джоэлю за это!

String.Join(",", TargetList.ToArray())
  • 2
    Есть и другие "ошибки". Во-первых, это решение не так идиоматично, как циклический просмотр списка самостоятельно. Во-вторых, если ToArray проходит через коллекцию, а Join тоже, это занимает вдвое больше времени, чем простой цикл foreach.
  • 0
    Конечно, всегда есть возможность использования System.Collections.Specialized.StringCollection.
Показать ещё 3 комментария
17

Решения до сих пор довольно сложны. Идиоматическое решение должно быть несомненно:

String.Join(",", x.Cast(Of String)().ToArray())

В новых версиях фреймов нет необходимости в фантастической акробатике. Предположим, что это не очень современная версия, было бы проще:

Console.WriteLine(String.Join(",", CType(x.ToArray(GetType(String)), String())))

mspmsp второе решение - хороший подход, но он не работает, потому что он пропускает ключевое слово AddressOf. Кроме того, Convert.ToString довольно неэффективен (много ненужных внутренних оценок), а класс Convert обычно не очень прост. Я стараюсь избегать этого, тем более, что он полностью избыточен.

  • 0
    Разве CType и CStr по сути не являются вызовами в класс Convert?
  • 0
    @Echostorm: где мне это сказать? @ Джоэл: совсем нет. Большую часть времени они вызывают вспомогательную функцию MS.VB.CS.Conversions.ToString что приводит к простому вызову ToString . Но даже этот метод я бы не назвал прямым y (в отличие от операторов приведения VB).
16

Что-то вроде:

String.Join(",", myArrayList.toArray(string.GetType()) );

Что в основном заставляет меня знать...

ИЗМЕНИТЬ

как насчет:

string.Join(",", Array.ConvertAll<object, string>(a.ToArray(), Convert.ToString));
  • 0
    упс .... это не правильно ... как насчет: string.Join (",", Array.ConvertAll <объект, строка> (a.ToArray (), Convert.ToString));
7

string.Join(" ,", myArrayList.ToArray()); Это будет работать с .net framework 4.5

1

Вот простой пример, демонстрирующий создание строки с разделителями-запятыми с использованием String.Join() из списка строк:

List<string> histList = new List<string>();
histList.Add(dt.ToString("MM/dd/yyyy::HH:mm:ss.ffff"));
histList.Add(Index.ToString());
/*arValue is array of Singles */
foreach (Single s in arValue)
{
     histList.Add(s.ToString());
}
String HistLine = String.Join(",", histList.ToArray());
1
foo.ToArray().Aggregate((a, b) => (a + "," + b)).ToString()

или же

string.Concat(foo.ToArray().Select(a => a += ",").ToArray())

Обновление, так как это очень старое. Вы должны, конечно, использовать string.Join сейчас. Это не существовало как вариант во время написания.

  • 0
    Оба решения имеют несколько недостатков и просто не хороши.
  • 0
    Вау, мне очень жаль! Я полностью пропустил тег «C #» в вопросе и предположил, что ваши ответы должны были быть действительными кодами VB. Мне стыдно. Но пока мы придирчивы: ваш второй ответ добавляет дополнительный «,» в конце.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню