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

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

C# 按特定屬性比較兩個(gè)大型項(xiàng)目列表

C# 按特定屬性比較兩個(gè)大型項(xiàng)目列表

C#
繁星coding 2022-10-23 13:30:18
我有兩個(gè)大型項(xiàng)目列表,它們的類看起來(lái)像這樣(兩個(gè)列表都屬于同一類型):public class Items{ public string ItemID { get; set; } public int QuantitySold { get; set; }}var oldList = new List<Items>(); // oldListvar newList = new List<Items>(); // new list舊列表包含來(lái)自數(shù)據(jù)庫(kù)的項(xiàng)目,新列表表示從 API 獲取的項(xiàng)目;兩個(gè)列表都可能非常大,每個(gè)列表包含 10000 多個(gè)項(xiàng)目(總共 20000 個(gè))我需要將 newList 中的項(xiàng)目與“oldList”中的項(xiàng)目進(jìn)行比較,并查看哪些項(xiàng)目具有相同的 itemID 值,具有不同的“QuantitySold”值,而那些具有不同“QuantitySold”值的項(xiàng)目應(yīng)存儲(chǔ)在名為“不同數(shù)量的項(xiàng)目”。我可以簡(jiǎn)單地做雙 foreach 列表并比較值,但由于兩個(gè)列表都很大,雙 foreach 循環(huán)的性能很糟糕,我做不到......有人可以幫我解決這個(gè)問(wèn)題嗎?@YamamotoTetsua 我已經(jīng)在使用 IEqualityComparer 來(lái)獲得所需的結(jié)果,但是它并沒(méi)有給出我期望的結(jié)果。這就是為什么......我有一個(gè)看起來(lái)像這樣的第一個(gè) IEqualityComparer: public class MissingItemComparer : IEqualityComparer<SearchedUserItems>    {        public static readonly IEqualityComparer<SearchedUserItems> Instance = new MissingItemComparer();        public bool Equals(SearchedUserItems x, SearchedUserItems y)        {            return x.ItemID == y.ItemID;        }        public int GetHashCode(SearchedUserItems x)        {            return x.ItemID.GetHashCode();        }    }這個(gè) IEqualityComparer 的使用基本上給了我來(lái)自 newList 的項(xiàng)目,這些項(xiàng)目在我的數(shù)據(jù)庫(kù)中不存在,如下所示:var missingItems= newItems.Except(competitor.SearchedUserItems.ToList(), MissingItemComparer.Instance).ToList();現(xiàn)在在此列表中,我將列出 API 中的新項(xiàng)目列表,并且不存在于我的數(shù)據(jù)庫(kù)中...第二個(gè) IEqualityComparer 基于舊列表和新列表中不同的 QuantitySold:public class ItemsComparer : IEqualityComparer<SearchedUserItems>    {        public static readonly IEqualityComparer<SearchedUserItems> Instance = new ItemsComparer();        public bool Equals(SearchedUserItems x, SearchedUserItems y)        {            return (x.QuantitySold == y.QuantitySold);        }        public int GetHashCode(SearchedUserItems x)        {            return x.ItemID.GetHashCode();        }    }使用示例:var differentQuantityItems = newItems.Except(competitor.SearchedUserItems.ToList(), ItemsComparer.Instance).ToList();他們確實(shí)從我的 oldList 中丟失了......但是第二個(gè) IEQualityComparer 也會(huì)將這些項(xiàng)目作為 differentQuantity 項(xiàng)目返回,它們確實(shí)是,但它們不存在于 oldList 中。所以它們不應(yīng)該包含在第二個(gè)列表中.
查看完整描述

4 回答

?
RISEBY

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

這是 LINQ Join的完美候選人:


var differentQuantityItems =

    (from newItem in newList

     join oldItem in oldList on newItem.ItemID equals oldItem.ItemID

     where newItem.QuantitySold != oldItem.QuantitySold

     select newItem).ToList();

這將返回所有具有不同 QuantitySold 的對(duì)應(yīng)舊項(xiàng)目的新項(xiàng)目。如果您還想包含沒(méi)有相應(yīng)舊項(xiàng)目的新項(xiàng)目,請(qǐng)使用左外連接


var differentQuantityItems =

    (from newItem in newList

     join oldItem in oldList on newItem.ItemID equals oldItem.ItemID into oldItems

     from oldItem in oldItems.DefaultIfEmpty()

     where oldItem == null || newItem.QuantitySold != oldItem.QuantitySold

     select newItem).ToList();

在這兩種情況下,連接運(yùn)算符都用于快速關(guān)聯(lián)具有相同 ItemID 的項(xiàng)目。然后您可以比較 QuantitySold 或任何其他屬性。


查看完整回答
反對(duì) 回復(fù) 2022-10-23
?
開(kāi)心每一天1111

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

即使根本沒(méi)有匹配項(xiàng),此代碼也將在不到一秒的時(shí)間內(nèi)運(yùn)行(如果一切都匹配,也將在不到一秒的時(shí)間內(nèi)運(yùn)行)。


它將返回兩個(gè)列表中存在的所有項(xiàng)目(即相同ItemID)但具有不同的QuantitySold.


using System;

using System.Collections.Generic;

using System.Linq;


namespace ConsoleApp5

{

    class Program

    {

        public class Items

        {

            public string ItemID { get; set; }

            public int QuantitySold { get; set; }

        }


        static void Main(string[] args)

        {

            // Sample data

            var oldList = new List<Items>();

            oldList.AddRange(Enumerable.Range(0, 20000).Select(z => new Items() { ItemID = z.ToString(), QuantitySold = 4 }));


            var newList = new List<Items>();

            newList.AddRange(Enumerable.Range(0, 20000).Select(z => new Items() { ItemID = z.ToString(), QuantitySold = 5 }));


            var results = oldList.Join(newList,

                                            left => left.ItemID,

                                            right => right.ItemID,

                                            (left, right) => new { left, right })

                                .Where(z => z.left.QuantitySold != z.right.QuantitySold).Select(z => z.left);


            Console.WriteLine(results.Count());

            Console.ReadLine();

        }

    }

}

的使用z.left意味著只有一個(gè)項(xiàng)目將被退回 - 如果你想要舊的和新的,而不是使用:


var results = oldList.Join(newList,

                                left => left.ItemID,

                                right => right.ItemID,

                                (left, right) => new { left, right })

                    .Where(z => z.left.QuantitySold != z.right.QuantitySold)

                    .Select(z => new[] { z.left, z.right })

                    .SelectMany(z => z);


查看完整回答
反對(duì) 回復(fù) 2022-10-23
?
POPMUISE

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

從大 O 復(fù)雜性的角度來(lái)看,僅比較嵌套 for 循環(huán)中的列表將屬于O(n*m)類,其中n是數(shù)據(jù)庫(kù)中列表的大小,而m是列表的大小從 API 獲取。

為了提高性能,您可以做的是對(duì)兩個(gè)列表進(jìn)行排序,這將花費(fèi)O(n log (n) + m log (m)),然后您可以在O(n + m)中找到新項(xiàng)目。因此,您的算法的整體復(fù)雜性將屬于O(n log (n) + m log (m))類。

這是一個(gè)關(guān)于所花費(fèi)時(shí)間的想法,將二次解與超線性解進(jìn)行比較。


查看完整回答
反對(duì) 回復(fù) 2022-10-23
?
函數(shù)式編程

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

您可以考慮使用帶有自定義編寫(xiě)的 except 子句,IEqualityComparer如下所示


var oldList = new List<Item>(); // oldList

var newList = new List<Item>(); // new list

var distinctList = newList.Except(oldList,new ItemEqualityComparer()).ToList();




class ItemEqualityComparer : IEqualityComparer<Item>

        {

            public bool Equals(Item i1, Item i2)

            {

                if (i1.ItemID == i2.ItemID && i1.QuantitySold != i2.QuantitySold)

                    return false;

                return true;

            }


            public int GetHashCode(Item item)

            {

                return item.ItemID.GetHashCode();

            }

        }


public class Item

        {

            public string ItemID { get; set; }

            public int QuantitySold { get; set; }

        }


查看完整回答
反對(duì) 回復(fù) 2022-10-23
  • 4 回答
  • 0 關(guān)注
  • 180 瀏覽

添加回答

舉報(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)