如何将List<int>转换为string[]?

25
我需要一种简单的方法将 List<int> 转换成 string 数组。

我有:

var the_list = new List<int>();
the_list.Add(1);
the_list.Add(2);
the_list.Add(3);

string[] the_array = new string[the_list.Count];
for(var i = 0 ; i < the_array.Count; ++i)
    the_array[i] = the_list[i].ToString();

...这看起来对我来说非常难看。

有更简单的方法吗?


注意:我正在寻找一种更简单的方式-不一定是更快的方式。


那是最有效的方法,除非数组中有许多重复的元素。当然,这并不意味着它一定是最简单的方法。 - Ben Voigt
看起来你在问两个不同的问题:哪个更有效率和哪个更容易。在我看来,这两个问题的答案是不同的 :) - Brian Genisio
@Brian:我在问哪个更容易 - 对于混淆感到抱歉。 - Nathan Osman
5个回答

70

使用LINQ:

string[] the_array = the_list.Select(i => i.ToString()).ToArray();

注意:尽管我肯定会选择这里提出的Select.ToArray方法,但它不太可能比您已经拥有的更快。你的方式很直接,可能是最有效的方式。再次强调,我选择了易于阅读/维护的Select.ToArray(LINQ)方法,这是@Etienne de Martel建议的,但你的问题表明你的选项效率低下。 - Brian Genisio
你知道是否可以将一个未绑定的方法传递给 Select 并自动将其绑定到元素,类似于 Ruby 的 Symbol#to_proc 技巧吗?例如像 the_list.Select(int.ToString) 这样的东西?(对于 Haskell 的人们:我基本上是在问是否有一种无点解决方案。) - Jörg W Mittag
@Ben Voigt,您能否解释一下为什么这段代码不够快? - jb.
@jb:因为它很可能需要将所有字符串累积到一个具有动态大小的集合中,然后一旦知道最终大小,就分配数组并复制所有元素。在这个例子中,在查询开始执行之前已经知道了计数,但LINQ库没有任何方法可以知道选择委托是否会改变列表的长度。JIT编译器知道,但它没有上下文知识来看到这对于什么有用。 - Ben Voigt
@Jorg: 是的,创建一个无绑定的委托是可能的。但是没有相应的简化语法,必须直接调用反射 API。 - Ben Voigt

6

我知道你有一个不错的答案,但是你不需要使用LINQ或Select。你可以使用ConvertAll和匿名方法来完成。像这样:

var list = new List<int>();
....
var array = list.ConvertAll( x => x.ToString() ).ToArray(); 

类似的想法,但我认为这不是Linq。如果有关系的话。


1
就我个人而言,ToArrayEnumerable类上的一个静态方法,这使得它在我的观点中属于LINQ。此外,使用Select可能比使用ConvertAll更高效:ConvertAll会在将列表转换为数组之前创建一个中间列表;而Select不需要创建该中间列表。 - LukeH
@LukeH 不,这不是LINQ。 - Yousha Aleayoub

4

对不起,我这台机器上没有安装.NET,所以完全没有测试:

var theList = new List<int>() { 1, 2, 3 };

var theArray = theList.Select(e => e.ToString()).ToArray();       // Lambda Form
var theArray = (from e in theList select e.ToString()).ToArray(); // Query Form

2

List有一个ToArray()方法。它可以节省您的打字时间,但可能不会更有效率。


4
它也不会将数组从“int”类型转换为“string”类型。 - Nathan Osman

1
因为你的列表只有数字,所以可以很容易地将它们转换成字符串。只需创建一个循环并将其成员转换为字符串即可。
string[] the_array = new string[the_list.Count];
int i=0;
foreach(var item in the_list)
{
  the_array[i] = item.ToString();
  i++;
}

请在您的回答中添加一些解释。仅仅发布代码可能会让人感到困惑。 - André Kool

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