gpt4 book ai didi

c# - 比较相邻的列表项

转载 作者:行者123 更新时间:2023-11-30 20:42:56 25 4
gpt4 key购买 nike

我正在编写一个重复文件检测器。为了确定两个文件是否重复,我计算了一个 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));
}
}
}

我的问题是:

  1. 如何在不出现越界错误的情况下将每个条目与其相邻条目进行比较?

  2. 我应该为此使用循环,还是有更好的 LINQ 或其他函数?

注意:为了避免困惑,我没有包含其余代码。如果你想看它,我可以把它包括在内。

最佳答案

首先计算 Crcs:

// It is assumed that DupInfo.CheckSum is nullable
public void GetCRCs(List<DupInfo> dupInfos)
{
dupInfos[0].CheckSum = null ;
for (int i = 1; i < dupInfos.Count(); i++)
{
dupInfos[i].CheckSum = null ;
if (dupInfos[i].Size == dupInfos[i - 1].Size)
{
if (dupInfos[i-1].Checksum==null) dupInfos[i-1].CheckSum = crc.ComputeChecksum(File.ReadAllBytes(dupInfos[i-1].FullName));
dupInfos[i].CheckSum = crc.ComputeChecksum(File.ReadAllBytes(dupInfos[i].FullName));
}
}
}

按大小和 crc 对文件进行排序后,识别重复项:

public void GetDuplicates(List<DupInfo> dupInfos) 
{
for (int i = dupInfos.Count();i>0 i++)
{ // loop is inverted to allow list items deletion
if (dupInfos[i].Size == dupInfos[i - 1].Size &&
dupInfos[i].CheckSum != null &&
dupInfos[i].CheckSum == dupInfos[i - 1].Checksum)
{ // i is duplicated with i-1
... // your code here
... // eventually, dupInfos.RemoveAt(i) ;
}
}
}

关于c# - 比较相邻的列表项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31010963/

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