如何比较两个IEnumerable对象并找到不同的新文件?



我想比较两个IEnumerable<>对象并返回一个新的IEnumerable<>对象。

我想比较newFiles对象和OriginalFiles对象,并做以下事情:

  • 找出newFiles对象中没有OriginalFiles对象的新文件。
  • 以及newFilesOriginalFiles对象中数据不同的文件。意思是那些在这两个对象之间被更改的文件。

我对每个文件都有md5hash,所以我比较md5hash并找出newFilesOriginalFiles对象之间的文件在数据方面发生了哪些变化。下面是我的代码:

public IEnumerable<FileConfig> GetNewFiles(IEnumerable<FileConfig> newFiles) =>
from element1 in newFiles
join element2 in this.OriginalFiles
on element1.Name.ToLowerInvariant() equals element2.Name.ToLowerInvariant()
into g
where !g.Any() || !element1.MD5Hash.SequenceEqual(g.First().MD5Hash)
select new FileConfig
{
Name = element1.Name,
Timestamp = element1.Timestamp,
MD5Hash = element1.MD5Hash,
};

我注意到一个bug,如果我在newFiles对象中有一些新文件,在OriginalFiles对象中没有,那么在我的最终输出中,我没有那个新文件?不知怎么的,它没有检测到新文件

例如,如果newFiles对象有11个文件,OriginalFiles对象有10个文件,所有这10个文件与newFiles对象中的10个文件相同,但在newFiles对象中有一个新文件,那么它不会在我的最终输出中检测到这一点。我在上面的代码做错了什么吗?

您不想要一个不匹配列表。您需要一个新文件的列表,不包括旧文件列表中存在的具有相同名称和哈希值的任何文件。

public IEnumerable<FileConfig> GetNewFiles(IEnumerable<FileConfig> newFiles) =>
newFiles
.Where
(
n => !this.OriginalFiles.Any( o => 
o.Name.Equals(n.Name, StringComparison.OrdinalIgnoreCase) &&
o.MD5hash.SequenceEqual(n.MD5Hash)
)
)
.Select
(
n => new FileConfig
{
Name = n.Name,
Timestamp = n.Timestamp,
MD5Hash = n.MD5Hash
}
);

最新更新