我有一个ITunes库XML文件备份文件 - 大约15 MB.
我的C驱动器上有20K音乐文件,E驱动器上有大约25K文件,文件夹结构完全相同.
我正在遍历第一个位置并逐个文件并检查文件是否在第二个位置.那部分对我有用.
现在,对于所有这样的重复文件,如果XML驱动器中存在来自E驱动器的文件路径,但XML中不存在C驱动器路径,那么我想从C驱动器中删除该文件.
检查XML文件中是否存在字符串的最佳方法是什么(我必须至少执行20K次)?
按字母顺序对要匹配的字符串列表进行排序,然后构建一个索引数组,该数组告诉您列表中每个作为字符串之一的起始字符的字符的开头位置,可能索引到第二个字符,具体取决于种类的广度以及您的匹配是否区分大小写。
使用流逐个字符读取文件,以最大程度地减少内存占用,检查索引数组以查看该字符在字符串列表中的开始和结束位置,以便您可以拉出该字符页面(如果有任何以这些字符组合开头的内容)。然后继续在页面内部进行过滤,直到剩下一个匹配项并且下一个字符匹配 0。
从要匹配的字符串列表中删除该字符串,如果需要,可以将其放入另一个列表中。然后开始检查下一个字符的索引,并在每次遇到没有匹配项时继续执行此操作。
该索引为您提供了更有效的聚合,以最大限度地减少迭代的项目数量。
这可以给你一个两个字符的深度索引:
Dictionary<string,int> stringIndex = new Dictionary<char,int>();
for(int i = 0; i < sortedSearchStrings.Length; i++;)
{
if (!stringIndex.Keys.Contains(sortedSearchStrings[i][0])) stringIndex[sortedSearchStrings[i][0]] = i;
if (!stringIndex.Keys.Contains(sortedSearchStrings[i][0] + sortedSearchStrings[i][1])) stringIndex[sortedSearchStrings[i][0] + sortedSearchStrings[i][1]] = i;
}
Run Code Online (Sandbox Code Playgroud)
然后要在列表中查找起始索引,您只需访问:
int startOfCurrentCharPage = stringIndex[string.Format("{0}{1}", lastChar, currentChar)];
Run Code Online (Sandbox Code Playgroud)