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

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

РЕДАКТИРОВАТЬ: Спасибо Джоэлу за указание на Список (Of T), который доступен в .net 2.0 и выше. Это НАМНОГО упрощает работу, если она у вас есть.


person Dillie-O    schedule 17.10.2008    source источник
comment
Я полагаю, поскольку вы используете ArrayList, вы используете .Net 1.0 или .Net 1.1?   -  person kͩeͣmͮpͥ ͩ    schedule 17.10.2008
comment
stackoverflow .com / questions / 799446 /.   -  person DmitryBoyko    schedule 04.04.2014


Ответы (7)


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

... в VB.NET:

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

...in C#

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

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

РЕДАКТИРОВАТЬ: Если вы используете .net 2.0 или выше, просто создайте объект типа List (Of String), и вы сможете получить то, что вам нужно. Большое спасибо Джоэлю за то, что он поднял этот вопрос!

String.Join(",", TargetList.ToArray())
person Dillie-O    schedule 17.10.2008
comment
Есть и другие подводные камни. Во-первых, это решение не так идиоматично, как самостоятельный просмотр списка. Во-вторых, если ToArray проходит по коллекции, и Join тоже, это занимает в два раза больше времени, чем простой цикл foreach. - person Bill the Lizard; 17.10.2008
comment
Конечно, всегда есть возможность использовать System.Collections.Specialized.StringCollection. - person ICR; 17.10.2008
comment
Если вы можете рассмотреть возможность использования List ‹string›, который имеет встроенный метод ToArray () и устраняет проблемы с типом. Кстати, typeof (строка) предпочтительнее Type.GetType (System.String). - person Jon B; 17.10.2008

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

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

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

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

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

person Community    schedule 17.10.2008
comment
Разве CType и CStr не являются вызовами класса Convert? - person Joel Coehoorn; 17.10.2008
comment
@Echostorm: где я могу это сказать? @ Джоэл: совсем нет. В большинстве случаев они вызывают вспомогательную функцию MS.VB.CS.Conversions.ToString, которая приводит к простому вызову ToString. Но даже этот метод я бы не называл direct y (в отличие от операторов приведения VB). - person Konrad Rudolph; 18.10.2008

Что-то типа:

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

Что в основном зацикливается, я знаю ...

ИЗМЕНИТЬ

как насчет:

string.Join(",", Array.ConvertAll<object, string>(a.ToArray(), Convert.ToString));
person mspmsp    schedule 17.10.2008
comment
упс .... это неправильно ... как насчет: string.Join (,, Array.ConvertAll ‹объект, строка› (a.ToArray (), Convert.ToString)); - person mspmsp; 17.10.2008

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

person bashburak    schedule 04.02.2016

Вот простой пример, демонстрирующий создание строки с разделителями-запятыми с помощью 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());
person Jim Lahman    schedule 17.04.2012

foo.ToArray().Aggregate((a, b) => (a + "," + b)).ToString()

or

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

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

person Echostorm    schedule 17.10.2008
comment
Вау, мне очень жаль! Я полностью упустил из виду тег «C #» в вопросе и предположил, что ваши ответы должны быть правильным кодом VB. Мне стыдно. Но пока мы придираемся к мелочам: ваш второй ответ добавляет в конце лишнее «,». - person Konrad Rudolph; 18.10.2008

Пока что я нашел, что это хорошее и быстрое решение

//CPID[] is the array
string cps = "";
if (CPID.Length > 0)
{   
    foreach (var item in CPID)
    {
        cps += item.Trim() + ",";
    }
}
//Use the string cps
person Monzur    schedule 09.01.2021