0

d我有以下代码来检查是否存在重复的文件名并删除带有重复文件的文件。

我可以通过在第一个列表中查找第一个和最后一个索引然后检查它是否不相同来做到这一点。列表项包含具有名称和 ID 的对象。列表中有大约 550k 个对象。

第二个循环有包含大约 5k 个文件路径的 filesPaths 列表。如果存在重复文件并且它在第二个列表中,那么我可以删除。

以下操作需要一天时间才能完成。有什么办法可以缩短这个时间吗?

foreach (DocNameObject someObjectDataFileRow in someObjectDataFileList)
{   
  int index1 = Array.FindIndex(someObjectDataFileList.ToArray(), row => row.docName.StartsWith(someObjectDataFileRow.docName));
  int index2 = Array.FindLastIndex(someObjectDataFileList.ToArray(), row => row.docName.StartsWith(someObjectDataFileRow.docName));

  Console.WriteLine(++i);
  if (index1 != index2) 
  {
    foreach (String fileName in filesPaths)
       {
         try
         {
            if (fileName.Contains(someObjectDataFileRow.docName))
            {
               if (File.Exists(fileName))
                 File.Delete(fileName);
            }
         }catch (Exception e)
         {
            Console.WriteLine("Problem deleting:" + e.Message);
         }
       }

    }
}
4

2 回答 2

2

您可以做的第一件事是根据 docName 对“someObjectDataFileList”进行排序。它可能会使 index1 和 index2 的计算变得多余。

另一个优化是从“filePaths”列表中删除文件名,一旦它被物理删除。

于 2013-07-15T07:06:12.840 回答
1

快速想到您可以使用for(...)loop 而不是foreach(..),因此您将始终拥有 index1 而无需额外计算,之后,您可以使用:

public int FindIndex(int startIndex, Predicate<T> match)

所以您将在列表的右侧查找重复项,因为索引的左侧部分已经被检查过。

另一件事是.ToArray()转换。您可以只转换一次枚举,而不是每个周期。

于 2013-07-15T07:17:13.890 回答