gpt4 book ai didi

c# - 比较包含很多对象的两个列表

转载 作者:行者123 更新时间:2023-11-30 19:32:05 25 4
gpt4 key购买 nike

我需要比较两个列表,每个列表包含大约 60,000 个对象。这样做最有效的方法是什么?我想选择目标列表中不存在的源列表中的所有项目。

我正在创建一个同步应用程序,其中 C# 扫描一个目录并将每个文件的属性放在一个列表中。因此有一个源目录列表和另一个目标目录列表。然后我不会复制所有文件,而是比较列表并查看哪些文件不同。如果两个列表具有相同的文件,那么我将不会复制该文件。这是我使用的 Linq 查询,当我扫描一个小文件夹时它有效,但当我扫描一个大文件夹时它不起作用。

// s.linst is the list of the source files
// d.list is the list of the files contained in the destination folder
var q = from a in s.lstFiles
from b in d.lstFiles
where
a.compareName == b.compareName &&
a.size == b.size &&
a.dateCreated == b.dateCreated
select a;

// create a list to hold the items that are the same later select the outer join
List<Classes.MyPathInfo.MyFile> tempList = new List<Classes.MyPathInfo.MyFile>();

foreach (Classes.MyPathInfo.MyFile file in q)
{
tempList.Add(file);
}

我不知道为什么这个查询要花很长时间。还有其他一些我可以利用的东西。例如,我知道如果源文件与目标文件匹配,则不可能与该文件有另一个副本,因为不可能有具有相同名称和相同路径的文件名。

最佳答案

为该类型创建一个相等比较器,然后您可以使用它来有效地比较集合:

public class MyFileComparer : IEqualityComparer<MyFile> {

public bool Equals(MyFile a, MyFile b) {
return
a.compareName == b.compareName &&
a.size == b.size &&
a.dateCreated == b.dateCreated;
}

public int GetHashCode(MyFile a) {
return
(a.compareName.GetHashCode() * 251 + a.size.GetHashCode()) * 251 +
a.dateCreated.GetHashCode();
}

}

现在您可以将它与 Intersect 等方法一起使用,以获取两个列表中都存在的所有项目,或使用 Except 来获取一个列表中存在但不存在的所有项目其他:

List<MyFile> tempList =
s.lstFiles.Intersect(d.lstFiles, new MyFileComparer()).ToList();

由于这些方法可以使用哈希码将项目划分到桶中,因此与必须将一个列表中的所有项目与另一个列表中的所有项目进行比较的联接相比,需要进行的比较要少得多.

关于c# - 比较包含很多对象的两个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6007892/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com