2009-01-26 201 views
54

有没有办法在c#或vb.net中将List(of Object)转换为List(of String)而不迭代所有项目? (幕后迭代是好的 - 我只想简洁的代码)将列表(的对象)转换为列表(的字符串)

更新: 很可能只是做一个新的,最好的办法选择

myList.Select(function(i) i.ToString()) 

myList.Select(i => i.ToString()); 

回答

60

不可能无需重复建立新列表。您可以将列表包装在实现IList的容器中。

您可以使用LINQ从对象列表这样得到的IEnumerable<string>一个懒惰的评估版本:

var stringList = myList.OfType<string>(); 
+13

相反OfType(其过滤列表)的使用选择(我=> i.ToString()) – 2009-05-22 10:14:02

+1

@geoff:取决于你在找什么。如果一个元素为null,则i.ToString将失败。你也可以考虑Cast (); – 2009-05-22 19:43:46

+0

@MehrdadAfshari:无论空处理如何,OfType()都会过滤掉不是字符串的项 - 它不会尝试转换或调用ToString(),它们只会被过滤掉。这不是要求的。 – 2013-07-16 15:20:29

3

否 - 如果要转换一个列表的所有元素,你就必须触摸全部该列表中的元素以某种方式或另一种方式。你可以用不同的方式(foreach()......或.ConvertAll()或其他)来指定/写入迭代,但最后,不管怎样,某些代码将会迭代遍历每个元素并将其转换。

马克

20

如果你想在转换是如何发生的更多的控制,你可以使用ConvertAll:

var stringList = myList.ConvertAll(obj => obj.SomeToStringMethod()); 
8

你的意思是这样的吗?

List<object> objects = new List<object>(); 
var strings = (from o in objects 
       select o.ToString()).ToList(); 
1

您可以在List(object)构建时进行字符串转换吗?这将是避免List(of object)创建后枚举整个列表的唯一方法。

22

这适用于所有类型。

List<object> objects = new List<object>(); 
List<string> strings = objects.Select(s => (string)s).ToList();