3 回答
TA貢獻(xiàn)1794條經(jīng)驗(yàn) 獲得超8個(gè)贊
小修正 - 當(dāng)前實(shí)現(xiàn)的時(shí)間復(fù)雜度是 O(N*M),你能得到的最好的是 O(N+M)。
問(wèn)題是如何有效地關(guān)聯(lián)這兩個(gè)集合。在 LINQ 中,這是通過(guò)連接實(shí)現(xiàn)的,對(duì)于這種一對(duì)多類型的關(guān)聯(lián) -組連接。標(biāo)準(zhǔn)的等價(jià)物||將是兩個(gè)組連接(匹配集)結(jié)果的聯(lián)合。
談到可讀性、LINQ 和連接,最好的方法是使用 LINQ查詢語(yǔ)法(有些人也稱它為理解語(yǔ)法是有原因的)。
所以有問(wèn)題的查詢可以有效地(并且希望可讀)重寫如下:
var invalidQuantityItems =
from returnItem in message.ItemsForReturn
join orderItem in message.OrderItems on returnItem.ItemNumber equals orderItem.ItemNumber
into matchingOrderItems1
join orderItem in message.OrderItems on returnItem.OrderItemId equals orderItem.OrderItemId
into matchingOrderItems2
let matchingOrderItemQuantity = matchingOrderItems1.Union(matchingOrderItems2)
.Sum(orderItem => orderItem.Quantity)
where matchingOrderItemQuantity < returnItem.Quantity
select returnItem;
TA貢獻(xiàn)1846條經(jīng)驗(yàn) 獲得超7個(gè)贊
我認(rèn)為字典方法是最好的方法。
關(guān)于可讀性,我認(rèn)為這應(yīng)該不會(huì)太差:
var quantityByItemNumber = message.OrderItems.
Where(i => i.ItemNumber != null).
ToDictionary(
i => i.ItemNumber,
i => i.Quantity);
var quantityByOrderItemId = message.OrderItems.ToDictionary(
i => i.OrderItemId,
i => i.Quantity);
var invalidQuantityItems = message.ItemsForReturn.Where(returnItem =>
{
int matchingOrderItemQuantity;
var isNumberMatch = returnItem.ItemNumber != null) &&
quantityByItemNumber.TryGetValue(returnItem.ItemNumber, out matchingOrderItemQuantity);
if (!isNumberMatch)
quantityByOrderItemId.TryGetValue(returnItem.OrderItemId, out matchingOrderItemQuantity)
return matchingOrderItemQuantity < returnItem.Quantity;
});
事實(shí)上,我認(rèn)為這更具可讀性,因?yàn)樗粫?huì)錯(cuò)誤地假裝有不止一個(gè)匹配OrderItem,必須對(duì)哪些數(shù)量求和。
TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超7個(gè)贊
就優(yōu)化多個(gè)條件而言:
始終將最有可能結(jié)束評(píng)估的條件放在首位(您必須根據(jù)現(xiàn)有數(shù)據(jù)或您對(duì)系統(tǒng)的了解來(lái)確定這一點(diǎn))。
如果一種情況比另一種情況更頻繁地發(fā)生的可能性不大,那么我們可以考慮評(píng)估本身。例如,如果
int比較比比較快string,則將int比較放在第一位。
此外,您的代碼不需要單獨(dú)的行來(lái)獲取Sum; 你可以用同一個(gè)表達(dá)式來(lái)做:
var invalidQuantityItems = message.ItemsForReturn.Where(returnItem =>
message.OrderItems
.Where(orderItem =>
orderItem.OrderItemId == returnItem.OrderItemId ||
orderItem.ItemNumber.Equals(returnItem.ItemNumber))
.Sum(orderItem => orderItem.Quantity) < returnItem.Quantity);
- 3 回答
- 0 關(guān)注
- 190 瀏覽
添加回答
舉報(bào)
