如何从ArrayList创建逗号分隔的字符串?


82

我将Ids的ArrayList存储在一个处理脚本中,该脚本要以逗号分隔的列表形式吐出,以输出到调试日志。有没有一种方法可以让我轻松地做到这一点而又无需遍历事物?

编辑:感谢Joel指出了.net 2.0及更高版本中可用的List(Of T)。如果可以的话,这使TONS更加容易。


我想,因为您使用的是ArrayList,所以您使用的是.Net 1.0或.Net 1.1?
坎普ͩ

Answers:


156

是的,我正在回答自己的问题,但我在这里还没有找到它,并且认为这是一件相当棘手的事情:

...在VB.NET中:

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

...在C#中

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

唯一的“陷阱”是,如果您使用Option Strict来确保正确进行转换,则ArrayList必须将项目存储为字符串。

编辑:如果您使用的是.net 2.0或更高版本,只需创建一个List(Of String)类型的对象,就可以使用所需的对象。非常感谢Joel提出了这一建议!

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

2
还有其他“陷阱”。一种是这种解决方案不像您自己遍历列表那样惯用。其次,如果ToArray遍历该集合,而Join也是如此,则此时间是简单的foreach循环的两倍。
比尔蜥蜴

当然,总有可能使用System.Collections.Specialized.StringCollection。
ICR

如果可以考虑使用List <string>代替,则它具有内置的ToArray()方法,并且可以消除类型问题。顺便说一句-typeof(string)比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类的调用吗?
Joel Coehoorn

@Echostorm:我在哪里说?@乔尔:一点也不。大多数情况下,他们会调用MS.VB.CS.Conversions.ToString帮助程序函数,从而导致简单的ToString调用。但是即使是这种方法,我也不会调用直接y(与通过VB cast运算符相反)。
康拉德·鲁道夫

16

就像是:

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

基本上循环你知道...

编辑

怎么样:

string.Join(",", Array.ConvertAll<object, string>(a.ToArray(), Convert.ToString));

糟糕...。这不对...怎么回事:string.Join(“,”,Array.ConvertAll <object,string>(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());

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

要么

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

正在更新,因为这非常古老。当然,您应该使用string.Join。在撰写本文时,它不作为选项存在。


哇,真对不起!我完全忽略了问题上的“ C#”标记,并认为您的答案是有效的VB代码。真可惜 但是,在我们挑剔的时候:您的第二个答案在末尾附加了一个额外的“,”。
康拉德·鲁道夫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.