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

90
我正在处理一个存储Id的ArrayList脚本,并希望将其作为逗号分隔列表输出到调试日志。是否有一种不需要循环的简便方法来实现这一点?
编辑:感谢Joel指出在.net 2.0及以上版本中可用的List(Of T)。如果您有它,这将使事情变得非常容易。

我猜测,因为你正在使用ArrayList,所以你正在使用.Net 1.0或.Net 1.1? - kͩeͣmͮpͥ ͩ
https://dev59.com/OnRA5IYBdhLWcg3w2x6W - NoWar
8个回答

168

是的,我正在回答自己的问题,但我还没有在这里找到答案,而且我认为这是一件相当不错的事情:

...在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循环慢两倍。 - Bill the Lizard
当然,也可以使用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:我在哪里说了那个?@Joel:根本没有。大多数情况下,他们调用MS.VB.CS.Conversions.ToString帮助函数,这会导致一个简单的ToString调用。但即使是这种方法,我也不会称之为直接(而不是通过VB强制转换运算符)。 - Konrad Rudolph

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

8

string.Join(" ,", myArrayList.ToArray()); 这段代码适用于 .net framework 4.5。


该代码的作用是将myArrayList中的元素用逗号隔开并组成一个字符串。

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

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

由于这篇文章非常老旧,因此需要更新。当然,现在应该使用string.Join。在撰写本文时,这不是一个可选项。


哇,真的很抱歉!我完全忽略了问题上的“C#”标签,并推测你的答案是有效的VB代码。我真是太丢人了。但是既然我们在挑剔:你的第二个答案在末尾附加了一个额外的“,”。 - Konrad Rudolph

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

0

到目前为止,我发现这是一个好的、快速的解决方案。

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

-1
仅需要小改动,使用最新的VS/C# 2022即可。由于我喜欢的答案逗号方向错误,使得名字的CSV列表看起来像这样:Rob ,Steve ,Ben。而你应该想要的是:Rob, Steve, Ben
ArrayList names = new ArrayList();

names.Add("Rob");
names.Add("Steve");
names.Add("Ben");

string namelist = String.Join(", ", names.ToArray());

Console.WriteLine(namelist);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接