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

84

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

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

Дилли-О
источник
Я полагаю, поскольку вы используете ArrayList, вы используете .Net 1.0 или .Net 1.1?
kͩeͣmͮpͥ ͩ

Ответы:

161

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

... в VB.NET:

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

... в C #

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

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

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

String.Join(",", TargetList.ToArray())
Дилли-О
источник
2
Есть и другие "подводные камни". Во-первых, это решение не так идиоматично, как самостоятельный просмотр списка. Во-вторых, если ToArray проходит по коллекции, и Join тоже, это занимает в два раза больше времени, чем простой цикл foreach.
Bill the Lizard
Конечно, всегда есть возможность использовать System.Collections.Specialized.StringCollection.
ICR
Если вы можете использовать вместо этого List <string>, который имеет встроенный метод ToArray () и устраняет проблемы с типом. Кстати, typeof (строка) предпочтительнее Type.GetType ("System.String").
Jon B
17

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

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

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

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

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

Конрад Рудольф
источник
Разве CType и CStr не являются вызовами класса Convert?
Джоэл Коэхорн
@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));
mspmsp
источник
упс .... это неправильно ... как насчет: string.Join (",", Array.ConvertAll <object, string> (a.ToArray (), Convert.ToString));
mspmsp
8

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

Башбурак
источник
2

Вот простой пример, демонстрирующий создание строки с разделителями-запятыми с помощью 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());
Джим Лахман
источник
2
foo.ToArray().Aggregate((a, b) => (a + "," + b)).ToString()

или же

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

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

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

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

//CPID[] is the array
string cps = "";
if (CPID.Length > 0)
{   
    foreach (var item in CPID)
    {
        cps += item.Trim() + ",";
    }
}
//Use the string cps
Монзур
источник