搜索列表然后从中删除C#

时间:2015-07-02 14:53:26

标签: c# list binary-search

我有一个文件名列表,如:

helloworld#123.xml
hi.xml
test#1.xml
thisguyrighthere.xml

我设计的程序将使用此列表(newFileList)与另一个列表(existingFileList)进行比较以获得重复项。当我运行程序时,它将使用二进制搜索(它们实际上是大型列表)搜索现有的文件列表,并在找到它们时从newFileList中删除。在修剪newFileList之后,它会将剩余元素添加到existingFileList。因此,如果我使用完全相同的newFileList运行程序两次,则在此过程结束后newFileList应为空。

我遇到的问题(代码如下所示)是第一个元素没有从newFileList中删除,而是反复添加到existingFileList并生成一个包含这些行的文件(最后一行是重复取决于程序运行的次数):

helloworld#123.xml
hi.xml
test#1.xml
thisguyrighthere.xml
helloworld#123.xml

以下是相关的代码段:

public class FileName : IComparable<FileName>
{
    public string fName { get; set; }
    public int CompareTo(FileName other)
    {
        return fName.CompareTo(other.fName);
    }
}

public static void CheckLists(List<FileName> newFileList, List<FileName> existingFileList)
    {
        for (int i = newFileList.Count - 1; i>-1; i--)
        {
            if (existingFileList.BinarySearch(newFileList[i]) > 0)
            {
                newFileList.Remove(newFileList[i]);
            }               
        }
    }

此过程的目的是从FTP获取文件列表并将其复制到另一个FTP,同时防止重复。如果有人能想到一个更好的方式(我已经尝试了一对,而且这似乎是迄今为止最快的),我会乐于改变这一切的运作方式。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

为什么不使用linq?这是你想要的吗?

newFileList.RemoveAll(item => existingFileList.Contains(item));

答案 1 :(得分:0)

我发现这很有效:

public static void CheckLists(List<FileName> sourceFileList, List<FileName> targetFileList)
    {
        for (int i = targetFileList.Count - 1; i>-1; i--)
        {
            sourceFileList.RemoveAll(x => x.fName == targetFileList[i].fName);             
        }
    }