搜索一个列表,然后从中删除C#
本文关键字:然后 删除 列表 一个 搜索 | 更新日期: 2023-09-27 18:00:58
我有一个文件名列表,比如:
helloworld#123.xml
hi.xml
test#1.xml
thisguyrighthere.xml
我正在设计的程序将使用此列表(newFileList(与另一个列表(existingFileList(进行重复比较。当我运行该程序时,它会用二进制搜索来搜索现有的FileList(它们实际上是大列表(,并在找到它们时从新的FileList中删除。在修剪完newFileList之后,它将向现有的FileList添加剩余的元素。因此,如果我用完全相同的newFileList运行程序两次,那么在这个过程结束后,newFileList应该是空的。
我遇到的问题(代码如下所示(是,第一个元素没有从newFileList中删除,而是重复添加到现有的FileList中,并生成一个包含以下行的文件(最后一行的重复取决于程序运行的次数(:
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,同时防止重复。如果有人能想出更好的方法(我试过几次,这似乎是迄今为止最快的(,我愿意改变这一切的工作方式。如有任何帮助,我们将不胜感激!
为什么不使用linq?这是你想要的吗?
newFileList.RemoveAll(item => existingFileList.Contains(item));
我发现这是有效的:
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);
}
}