【发布时间】:2020-08-03 05:28:15
【问题描述】:
我想比较两个IEnumerable<> 对象并返回一个新的IEnumerable<> 对象。
下面是我的代码,其中我有newFiles 对象,然后我有OriginalFiles 对象。我想比较这两个IEnumerable<> 对象并找到那些是新文件和修改过的文件。
FileConfig 类将每个文件的 md5Hash 值作为字符串,因此我可以比较 md5Hash 字符串上的 OriginalFiles 和 newFiles 对象以确定哪些文件已更改,然后创建一个新的 IEnumerable<FileConfig>带有那些修改过的文件 + 新文件的对象。
例如: 如果newFiles 对象共有 10 个文件,OriginalFiles 有 8 个文件,则意味着其中有两个新文件。然后剩下的 8 个我将比较并查看使用 md5Hash 字符串更改了哪些文件,因此如果 8 个文件中有 5 个文件更改并且还有两个新文件,那么我将返回 7 个文件作为 IEnumerable<FileConfig> 对象。
public class ProcessFile
{
public IEnumerable<FileConfig> OriginalFiles { get; set; }
public IEnumerable<FileConfig> GetNewFiles(IEnumerable<FileConfig> newFiles)
{
// compare OriginalFiles and newFiles object and return a new IEnumerable<FileConfig> object
// which has only those files which are modified or new by comparing on md5Hash string
foreach (var element1 in newFiles)
{
var newFileName = element1.Name;
var newMd5Hash = element1.MD5Hash;
foreach (var element2 in this.OriginalFiles)
{
var originalFileName = element2.Name;
var originalmd5Hash = element2.MD5Hash;
if (newFileName.Equals(originalFileName, StringComparison.InvariantCultureIgnoreCase) && !newMd5Hash.Equals(originalmd5Hash, StringComparison.InvariantCultureIgnoreCase))
{
yield return new FileConfig
{
Name = newFileName,
Timestamp = element1.Timestamp,
MD5Hash = newMd5Hash
};
}
}
}
}
}
public class FileConfig
{
public string Name { get; set; }
public DateTime Timestamp { get; set; }
public string MD5Hash { get; set; }
}
我可以运行两个 for 循环并比较它们的 md5Hash 字符串上的每个文件,并找出哪些文件已被修改并返回新的 IEnumerable<FileConfig> 对象,但是是否有任何快捷方式可以轻松完成相同的事情或其他更好在 C# 中的方式?
【问题讨论】:
-
您可以使用 Where 和 Select 将代码替换为 Linq 语句。
-
@SveinTerjeGaup 你能提供一个关于我如何使用 linq 做到这一点的例子吗?
-
你不是在几个小时前问过这个问题吗?
-
您谈论“简单”和“更好”,但至少对于编程来说,这些并不是一成不变的,而且可能相互矛盾。 Easy 可以尝试创建单个 Linq 语句。这“容易”吗?或者可能是更长的代码,但步骤非常清晰和简单?至于更好的是,您可以使用临时哈希表将时间复杂度从 O(n*n) 降低到 O(n) 来解决这个问题,如果您遇到速度问题,这会更好。在其他情况下,它会过度设计。
标签: c# asp.net linq ienumerable