第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

優(yōu)化具有多個(gè)條件的嵌套 where 子句的最佳方法是什么?

優(yōu)化具有多個(gè)條件的嵌套 where 子句的最佳方法是什么?

C#
陪伴而非守候 2023-04-29 16:35:41
ReturnItems我正在嘗試查找退回的單個(gè)商品的數(shù)量超過(guò)該商品的原始訂購(gòu)數(shù)量的列表。所以這里有 2 個(gè)不同的對(duì)象列表 -IEnumerable<ReturnItem>和IEnumerable<OrderItem>. 問(wèn)題在于,根據(jù)進(jìn)行退貨的來(lái)源(我們的工作流程中有多個(gè)地方可以進(jìn)行退貨),給ItemNumber定的 on aReturnItem可能為空。在這種情況下,我們需要依靠 來(lái)ReturnItem.OrderItemId將它與OrderItem.我已經(jīng)使用 LINQ 解決了這個(gè)問(wèn)題,但它需要一個(gè)嵌套的 for 循環(huán)(在引擎蓋下)所以我試圖盡可能避免這種情況同時(shí)保持可讀性。換句話說(shuō),我想避免 O(N ^2) 并尋找 O(N) 或更好但又一次,同時(shí)保持可讀性(我知道我在這里要求很多但我想我會(huì)看看是否有人有創(chuàng)造性的解決方案)。我創(chuàng)建了一個(gè)解決方案,其中我有兩個(gè)用于訂單項(xiàng)的字典。其中一個(gè),鍵是項(xiàng)目編號(hào),另一個(gè)鍵是訂單項(xiàng)目 ID。這有效并解決了性能問(wèn)題,但我完全失去了可讀性。這是我的原始 LINQ 語(yǔ)句:// ItemsForReturn = IEnumerable<ReturnItem>// OrderItems = IEnumerable<OrderItem>var invalidQuantityItems = message.ItemsForReturn.Where(returnItem =>{    var matchingOrderItemQuantity = message.OrderItems        .Where(orderItem => orderItem.ItemNumber.Equals(returnItem.ItemNumber) || orderItem.OrderItemId == returnItem.OrderItemId)        .Sum(orderItem => orderItem.Quantity);    return matchingOrderItemQuantity < returnItem.Quantity;});以及上面使用的變量的相應(yīng)類型:public class ReturnItem{    public int OrderItemId {get; set;}    public string ItemNumber {get; set;}    public int Quantity {get; set;}    // There's more properties but these are the ones that matter{public class OrderItem{    public int OrderItemId {get; set;}    public string ItemNumber {get; set;}    public int Quantity {get; set;}    // There's more properties but these are the ones that matter{我希望這var invalidQuantityItems將是一個(gè)IEnumerable<ReturnItems>其單個(gè)項(xiàng)目的數(shù)量大于訂購(gòu)的數(shù)量(即他們?cè)噲D返回比他們首先訂購(gòu)的更多)。
查看完整描述

3 回答

?
幕布斯7119047

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;


查看完整回答
反對(duì) 回復(fù) 2023-04-29
?
喵喵時(shí)光機(jī)

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ù)量求和。


查看完整回答
反對(duì) 回復(fù) 2023-04-29
?
幕布斯6054654

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超7個(gè)贊

就優(yōu)化多個(gè)條件而言:

  1. 始終將最有可能結(jié)束評(píng)估的條件放在首位(您必須根據(jù)現(xiàn)有數(shù)據(jù)或您對(duì)系統(tǒng)的了解來(lái)確定這一點(diǎn))。

  2. 如果一種情況比另一種情況更頻繁地發(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);


查看完整回答
反對(duì) 回復(fù) 2023-04-29
  • 3 回答
  • 0 關(guān)注
  • 190 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)