2009-01-26 202 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();