我已經知道是相同大小的兩個集合:如何使用一個集合作爲參數在另一個相同大小的集合中調用函數?
List<Drivers> drivers;
List<Car> cars;
我需要把司機從i
地方i
車:
for (int i = 0; i < drivers.Count; i++)
cars[i].AssignDriver(drivers[i]);
我可以做,沒有循環?
我已經知道是相同大小的兩個集合:如何使用一個集合作爲參數在另一個相同大小的集合中調用函數?
List<Drivers> drivers;
List<Car> cars;
我需要把司機從i
地方i
車:
for (int i = 0; i < drivers.Count; i++)
cars[i].AssignDriver(drivers[i]);
我可以做,沒有循環?
僅LINQ查詢對象,所以你已經住在一起循環。另一方法是使用List.ForEach方法,但我不會使用它,因爲它有時會混淆建議,反正下面是例子教育目的:
drivers.Select((d,i) => new { Index = i, Driver = d })
.ToList()
.ForEach(entry => car[entry.Index].AssignDriver(entry.Driver));
相關鏈接:
值得注意的是,這段代碼效率不高:它創建一個新列表並實際執行一個雙重迭代(一次創建列表然後執行ForEach)。雖然如果表現不重要,這很好。 –
絕對正確! ToList()爲每個項目創建一個新的列表實例並複製內存 – sll
LINQ是你的朋友。看看這個: http://msdn.microsoft.com/en-us/library/bb548891.aspx
但請注意,我會考慮你現有的方法也是一個好的方法。
你應該避免修改無狀態LINQ操作符(如Select)中的數據(所謂的副作用)。它們的語義意味着這個要求。 IX中的「ForEach」等運算符專門用於表示正在引入副作用。 –
那麼,在最低的水平 - 沒有。無論如何你都需要迭代。
但是有一些很好的庫可以使處理這種情況更容易。例如,有Interactive Extensions for .NET。雖然,他們不是在生產狀態下,他們有可能做到這一點是這樣的:
cars.Zip(drivers, (car, driver) => new { car, driver })
.ForEach(x => x.car.AssignDriver(x.driver));
應該是'ForEach(x => x.car.AssignDriver(x.driver));' –
@RichardFriend絕對,謝謝。 –
是List.ForEach()還是自定義擴展方法? – sll
你需要匹配司機和汽車?或者你想從汽車中取代有些來自司機的價值?我的猜測是你想要司機和汽車之間的一對一關係。 –
@PawanMishra我不明白你的問題,我只需要調用'AssignDriver'方法,就像我在描述中所寫的那樣 – javapowered