Як створити рядок, розділений комами, із ArrayList?


84

Я зберігаю ArrayList з ідентифікаторів у сценарії обробки, який я хочу виплюнути у вигляді списку, розділеного комами, для виведення в журнал налагодження. Чи є спосіб я це легко отримати, не перебираючи речі?

EDIT: Дякуємо Джоелю за вказівку на Список (Т), доступний у .net 2.0 та новіших версіях. Це полегшує ситуацію з TONS, якщо вона доступна.


Я припускаю, оскільки ви використовуєте 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, щоб переконатися, що перетворення відбувається належним чином.

EDIT: Якщо ви використовуєте .net 2.0 або новішу версію, просто створіть об’єкт типу List (Of String), і ви зможете отримати те, що вам потрібно. Велике спасибі Джоелу за те, що він це вигадав!

String.Join(",", TargetList.ToArray())

2
Є й інші "причепи". Одне з них полягає в тому, що це рішення не таке ідіоматичне, як перегляд списку самостійно. По-друге, якщо ToArray проходить колекцію, а Join - теж, це займає вдвічі більше часу, ніж простий цикл foreach.
Білл Ящірка

Звичайно, завжди є можливість використовувати System.Collections.Specialized.StringCollection.
ICR

Якщо ви можете замість цього використати List <string>, він має вбудований метод ToArray () і усуває проблеми з типом. До речі - typeof (рядок) є кращим, ніж Type.GetType ("System.String").
Джон Б

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?
Joel Coehoorn

@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));

упс .... це неправильно ... як щодо: string.Join (",", Array.ConvertAll <об'єкт, рядок> (a.ToArray (), Convert.ToString));
mspmsp


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())

Оновлення, оскільки це надзвичайно давно. Ви, звичайно, повинні використовувати рядок. Приєднуйтесь зараз. На момент написання статті це не існувало як варіант.


Ого, дуже мені шкода! Я повністю пропустив тег “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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.