2010-02-18 60 views
20

什麼可能是LINQ等效於以下代碼?如何在LINQ中通過索引連接兩個集合

string[] values = { "1", "hello", "true" }; 
Type[] types = { typeof(int), typeof(string), typeof(bool) }; 

object[] objects = new object[values.Length]; 

for (int i = 0; i < values.Length; i++) 
{ 
    objects[i] = Convert.ChangeType(values[i], types[i]); 
} 

回答

24

.NET 4的拉鍊操作,可以讓您連接兩個集合在一起。

var values = { "1", "hello", "true" }; 
var types = { typeof(int), typeof(string), typeof(bool) }; 
var objects = values.Zip(types, (val, type) => Convert.ChangeType(val, type)); 

的.zip方法優於。選擇((S,I)=> ...),因爲。選擇將拋出一個異常時,你的藏品不具有相同數量的元素,而。 Zip將盡可能多地將zip元素壓縮在一起。

如果您使用的是.NET 3.5,那麼您必須先解決。選擇或編寫自己的.Zip方法。

現在,所有這一切,我從來沒有使用Convert.ChangeType。我假設它適用於你的場景,所以我會留下這個。

+1

或者乾脆:'無功對象= values.zip(類型,(V,T)=> Convert.ChangeType(V,T));' – Ken 2010-02-18 15:18:11

+1

肯,你說得對。我會更新我的帖子。謝謝。 – 2010-02-18 15:21:54

+0

已更新。謝謝你的提示。 – 2010-02-18 15:22:58

6

假設兩個數組的大小相同:

string[] values = { "1", "hello", "true" }; 
Type[] types = { typeof(int), typeof(string), typeof(bool) }; 

object[] objects = values 
    .Select((value, index) => Convert.ChangeType(value, types[index])) 
    .ToArray(); 
4
object[] objects = values.Select((s,i) => Convert.ChangeType(s, types[i])) 
         .ToArray();