以优雅和快速的方式处理列表以进行重复

时间:2013-07-15 06:56:39

标签: c# list

dI具有以下代码来检查重复文件名的存在并删除具有重复文件的文件。

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

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

以下操作需要一天时间才能完成。有没有办法缩短那个时间?

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);
         }
       }

    }
}

2 个答案:

答案 0 :(得分:2)

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

另一个优化是,一旦物理删除,也会从'filePaths'列表中删除fileName。

答案 1 :(得分:1)

在快速思考中,您可以使用for(...)循环而不是foreach(..),因此您将始终拥有index1而无需额外的计算,之后,您可以使用:

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

因此您将在列表的右侧部分中查找重复项,因为已经检查了索引的左侧部分。

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