【发布时间】:2015-09-09 17:38:39
【问题描述】:
我正在编写一个重复文件检测器。为了确定两个文件是否重复,我计算了一个 CRC32 校验和。由于这可能是一项昂贵的操作,我只想计算具有匹配大小的另一个文件的文件的校验和。我已经按大小对文件列表进行了排序,并且正在循环将每个元素与其上方和下方的元素进行比较。不幸的是,开头和结尾都存在问题,因为分别没有上一个或下一个文件。我可以使用 if 语句来解决这个问题,但感觉很笨拙。这是我的代码:
public void GetCRCs(List<DupInfo> dupInfos)
{
var crc = new Crc32();
for (int i = 0; i < dupInfos.Count(); i++)
{
if (dupInfos[i].Size == dupInfos[i - 1].Size || dupInfos[i].Size == dupInfos[i + 1].Size)
{
dupInfos[i].CheckSum = crc.ComputeChecksum(File.ReadAllBytes(dupInfos[i].FullName));
}
}
}
我的问题是:
如何在不出现越界错误的情况下将每个条目与其相邻条目进行比较?
我应该为此使用循环,还是有更好的 LINQ 或其他功能?
注意:我没有包含我的其余代码以避免混乱。如果你想看,我可以附上。
【问题讨论】:
-
而不是从 0 开始从 1 开始并在
dupInfos.Count() -1结束 -
另一个您可能没有考虑过的问题... 如果有 4 个文件大小相同,并且第一个和第 4 个文件相同,该怎么办。您的代码会错过这些,因为它们之间还有其他大小相同的不同文件。
-
如果您不能确定是否找到所有匹配项,则需要对每个文件大小组中的每一对进行比较,而不仅仅是上下一个。跨度>
-
3dd - 这是我目前的策略,但感觉不优雅。我只是想知道是否有更好的方法。 DiscipleMichael - 我的计划是按大小和 CRC 排序。然后我只能再次检查相邻的文件,而不是遍历大小组中的每个文件。
-
您不必检查整个集合中的每个可能对...只需检查一组相同文件大小中的每个可能对