none
無法理解陣列物件可以用Where卻不能用Remove RRS feed

  • 問題

  • 前輩好:

    今天用LINQ練習某道題目時遇到問題,但一直無法理解

    先附上程式碼

       public double GetAmount(List<Book> books)
            {
                if (books == null)
                    return 0;
    
                var bookGroups = books.GroupBy(o => o.Id).ToList();
    
                //總共有幾總不同的書
                int count = bookGroups.Count();
    
                double totalAmount = 0;
                for (int i = 0; i < count; i++)
                {
                    //這次有幾種不同的書籍
                    var kindAmount = bookGroups.Count();
    
                    //取得這次群組中最少的是哪本書
                    var minGroupAmount = bookGroups.Min(o => o.Key);
    
                    totalAmount += kindAmount * Price * _discountLookup[kindAmount];
    
                    for (var j = kindAmount - 1; j >= 0; j--)
                    {
                        if (bookGroups[j].Count() - minGroupAmount == 0)
                        {
                            bookGroups.Remove(bookGroups[j]);
                        }
                        else
                        {
                            var paidBooks = bookGroups[j].Take(minGroupAmount);
    
                            //bookGroups[j].Remove(paidBooks);
                        }
                    }
                }
    
                return totalAmount;
            }

    扣除括弧和空白行,倒數第二行中,為什麼我的bookGroup[j] 無法使用Remove();

    是打.不會跳出Remove這方法可以選,自己打也會有紅字告知沒有此方法可以使用的無法使用。

    明明可以用take或是where,但卻無法用remove把元素刪除。

    想請問是什麼原因造成可以進行take、where進行篩選(用即時運算模式看的確是撈出預想中的結果),但卻無法使用remove。

    謝謝前輩


    • 已編輯 HumorA 2019年11月18日 上午 08:03 補充說明
    2019年11月18日 上午 08:02

所有回覆

  • 你的KindAmount是bookGroups的長度

    for迴圈是跑KindAmount

    然後你在for迴圈裡面remove bookGroups的元素

    不就會造成for迴圈在跑的時候超出索引...


    • 已編輯 Homura Lin 2019年11月18日 上午 09:39
    2019年11月18日 上午 09:37
  • 我想應該有更好的寫法。可以聊聊這個 method 的整個邏輯嗎 ? 也就是從 傳入 books 開始到最後想輸出的結果為何?

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    2019年11月18日 上午 10:50
    版主
  • To Homoua Lin大

    不會的,

    我是用--移除最後一個,所以不會造成超出索引

    2019年11月18日 下午 12:36
  • To Bill大:

    我最後拐了很多彎,用超級爛的實作方法把這完成了。

    我也覺得應該有更好的寫法,但目前我的程度還不夠把我的邏輯用程式碼順順的寫出來,

    最後只能抽Method讓這段看起來漂亮點。

    因為這是某位老師上課的題目,我不確定適不適合把題目丟上來公開討論。

    若之後還有開放EF Core 3這門課,我一定會報名(這次剛好某一周出國無法報名),

    到時有機會希望能再和老師討論這題。

    謝謝Bill大

    2019年11月18日 下午 12:55
  • 我實在很想解這個邏輯啊 ~~

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    2019年11月18日 下午 02:22
    版主
  • 你已經轉換為 ToList 物件,盡量用 List 物件的操作方式,bookGroup[j] 這種操作不是很合適。

    list remove sample code


    理直氣和,切記。

    個人

    2019年11月19日 上午 01:16