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

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

如何比較和更新包含大量項(xiàng)目的 2 個(gè)列表?

如何比較和更新包含大量項(xiàng)目的 2 個(gè)列表?

C#
小怪獸愛吃肉 2023-04-29 15:51:09
注意:使用 LINQ 連接解決了這個(gè)問題。我需要比較源列表中的列表值是否存在于目標(biāo)列表中,如果是,則將其保存到第三個(gè)列表。我編寫的代碼確實(shí)有效,但它花費(fèi)了很多時(shí)間,因?yàn)槲业脑戳斜碛?30k 個(gè)項(xiàng)目,并且它將每個(gè)項(xiàng)目值與 1500 萬個(gè)目標(biāo)列表進(jìn)行比較,這需要很多時(shí)間。因?yàn)樗看味紩?huì)遍歷整個(gè)列表(30k *1500 萬次)查看顯然不是最佳但可以完成工作的代碼。        // The below code will generate the lists from CSV file        The lists are below for sample        **Source List**        FileId  FilePath      FileChecksum        1       somepath A    check1        2       somepath AA   check2        3       somepath AAB  check3        4       somepath B    check4        5       somepath BB   check5        **Destination List**        StepId  StatusID  JobId ProjectId FileId     FilePath        5        6         4    2091      577206853  somepath A        5        6         4    2092      577206853  somepath AA        5        6         4    2093      577206853  somepath AAA        5        6         4    2094      577206853  somepath AB        5        6         4    2095      577206853  somepath A        5        6         4    2096      577206853  somepath B        5        6         4    2097      577206853  somepath BB        List<Source> SourceList = File.ReadAllLines(@"D:\source.csv").Skip(1).Select(v => Source.SourceFromCSv(v)).ToList();        List<Destination> DestinationList = File.ReadAllLines(@"D:\Destination.csv").Skip(1).Select(d => Destination.FromDestinationCSV(d)).ToList();        //This will compare and create a new list        var result1 =            from s in SourceList            from d in DestinationList            where (d.FilePath.ToLower() == s.FilePath.ToLower())             select (d.StepId + "," + d.StatusId + "," + d.JobId + "," +              d.ProjectId + "," + d.FileId + "," + d.FilePath + "," + 
查看完整描述

5 回答

?
皈依舞

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

您可以對(duì)兩個(gè)列表進(jìn)行排序,然后逐行進(jìn)行比較。算法復(fù)雜度為 O(n log n+n)。

您將第一行數(shù)據(jù) A 與第一行數(shù)據(jù) B 進(jìn)行比較,然后在“較大”行上增加指針的索引。如果數(shù)據(jù) A 有 8 而數(shù)據(jù) B 有 7 和 9,當(dāng)你達(dá)到 9 時(shí),你就會(huì)知道數(shù)據(jù) B 中不存在 8。

您應(yīng)該開始比較最大可能的索引。這樣,如果列表確實(shí)是一個(gè)子列表,您可以快速終止。


查看完整回答
反對(duì) 回復(fù) 2023-04-29
?
慕尼黑8549860

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

你可以反過來做。您可以迭代 3000 萬個(gè)條目,而不是從 30k 個(gè)源條目中選擇一個(gè)。如果找到所有 30k 個(gè)條目,或者在最壞的情況下,找到 3000 萬個(gè)條目,則可以停止。那還是比 30K*15M 好。



查看完整回答
反對(duì) 回復(fù) 2023-04-29
?
拉丁的傳說

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

var query = from s in SourceList

 join d in DestinationList on 

 s.FilePath.ToLower().TrimEnd() equals d.FilePath.ToLower().TrimEnd()

 select (d.StepId + "," + d.StatusId + "," + d.JobId + "," +d.ProjectId + "," + d.FileId + "," + d.FilePath + "," + s.FileChecksum);

LINQ join 在不到 5 秒的時(shí)間內(nèi)完成了同樣的事情。


查看完整回答
反對(duì) 回復(fù) 2023-04-29
?
蝴蝶刀刀

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

是的,如果您不需要列表的所有功能,將基本類型設(shè)置為 aHashSet<T>將顯著改善查找。您的自定義類型可能需要實(shí)現(xiàn)適當(dāng)?shù)?code>GetHashCode()功能以進(jìn)一步提高查找速度。

看:

  • HashSet<T>

  • GetHashCode()

不要調(diào)用new HashSet(query.ToList()),而是在實(shí)例化列表時(shí)直接轉(zhuǎn)換為哈希集,query.ToHashSet()可選地傳入一個(gè) Equality Comparer,見下文:

  • ToHashSet(IEqualityComparer<T>)

除了自定義GetHashCode實(shí)現(xiàn)之外,您還可以實(shí)現(xiàn)自定義IEqualityComparer來處理特定情況,例如您的情況,其中特定字段構(gòu)成了平等規(guī)則。現(xiàn)在的 Visual Studio 和 Resharper 提供了一個(gè)內(nèi)置的重構(gòu)來生成GetHashCodeEquals.

看:

  • IEqualityComparer<T>

然后,您可以使用IntersectWith一次調(diào)用獲取兩組中的所有項(xiàng)目:

看:

  • IntersectWith()

創(chuàng)建一個(gè)可以將Source和轉(zhuǎn)換Destination為的特殊對(duì)象,或者為它們提供相同的基類將允許這樣做。

您也可以使用 aIDictionary<Key, Value>并使密鑰成為Item.FilePath.ToLower(),與上述相同的原則適用。這將允許運(yùn)行時(shí)使用字符串檢查該項(xiàng)目是否存在于其他列表中GetHashCode,默認(rèn)情況下這是高度優(yōu)化的。


查看完整回答
反對(duì) 回復(fù) 2023-04-29
?
互換的青春

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

原則上,您所做的只是將文件校驗(yàn)和附加到目標(biāo)列表的末尾。


從源列表中創(chuàng)建一個(gè)散列或字典,然后你的新列表看起來像這樣。


//create dictionary SourceDictionary<string,string> with key = filepath.tolower and value = checksum

var newList = DestinationList.select(d => $"{d.thing1},{d.thingN}" + SourceDictionary[d.filename.tolower()])

應(yīng)該快得多


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

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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