2011-11-28 26 views
1

我已經知道是相同大小的兩個集合:如何使用一個集合作爲參數在另一個相同大小的集合中調用函數?

List<Drivers> drivers; 
List<Car> cars; 

我需要把司機從i地方i車:

for (int i = 0; i < drivers.Count; i++) 
    cars[i].AssignDriver(drivers[i]); 

我可以做,沒有循環?

+0

你需要匹配司機和汽車?或者你想從汽車中取代有些來自司機的價值?我的猜測是你想要司機和汽車之間的一對一關係。 –

+0

@PawanMishra我不明白你的問題,我只需要調用'AssignDriver'方法,就像我在描述中所寫的那樣 – javapowered

回答

1

僅LINQ查詢對象,所以你已經住在一起循環。另一方法是使用List.ForEach方法,但我不會使用它,因爲它有時會混淆建議,反正下面是例子教育目的:

drivers.Select((d,i) => new { Index = i, Driver = d }) 
     .ToList() 
     .ForEach(entry => car[entry.Index].AssignDriver(entry.Driver)); 

相關鏈接:

+0

值得注意的是,這段代碼效率不高:它創建一個新列表並實際執行一個雙重迭代(一次創建列表然後執行ForEach)。雖然如果表現不重要,這很好。 –

+0

絕對正確! ToList()爲每個項目創建一個新的列表實例並複製內存 – sll

-1

LINQ是你的朋友。看看這個: http://msdn.microsoft.com/en-us/library/bb548891.aspx

但請注意,我會考慮你現有的方法也是一個好的方法。

+0

你應該避免修改無狀態LINQ操作符(如Select)中的數據(所謂的副作用)。它們的語義意味着這個要求。 IX中的「ForEach」等運算符專門用於表示正在引入副作用。 –

1

那麼,在最低的水平 - 沒有。無論如何你都需要迭代。

但是有一些很好的庫可以使處理這種情況更容易。例如,有Interactive Extensions for .NET。雖然,他們不是在生產狀態下,他們有可能做到這一點是這樣的:

cars.Zip(drivers, (car, driver) => new { car, driver }) 
    .ForEach(x => x.car.AssignDriver(x.driver)); 
+1

應該是'ForEach(x => x.car.AssignDriver(x.driver));' –

+0

@RichardFriend絕對,謝謝。 –

+0

是List.ForEach()還是自定義擴展方法? – sll

相關問題