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è)子列表,您可以快速終止。
TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超11個(gè)贊
你可以反過來做。您可以迭代 3000 萬個(gè)條目,而不是從 30k 個(gè)源條目中選擇一個(gè)。如果找到所有 30k 個(gè)條目,或者在最壞的情況下,找到 3000 萬個(gè)條目,則可以停止。那還是比 30K*15M 好。
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)完成了同樣的事情。
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)化的。
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)該快得多
- 5 回答
- 0 關(guān)注
- 199 瀏覽
添加回答
舉報(bào)
