我有以下方法将子路径的列表(行)与List<FileInfo>
进行比较,并将任何缺少的条目添加到列表_missingImageFolderEnteries
。我正在使用LINQ并注意到处理起来似乎非常缓慢。关于如何提高绩效的任何想法或想法?也许LINQ不在这里,但我认为它应该比标准循环更有效。
private List<FileInfo> _imageFilesInFolderPathList = new List<FileInfo>();
private readonly List<Tuple<string, string>> _missingImageFolderEnteries = new List<Tuple<string, string>>();
private void CrossCheckImageWithFolder(EnumerableRowCollection<DataRow> Rows)
{
foreach (var dr in Rows)
{
var filepath = dr[ImagePathHeader].ToString();
if (!_imageFilesInFolderPathList.Any(row =>
row.FullName.EndsWith(FilePathHandler.FormatSubPath(filepath))))
_missingImageFolderEnteries.Add(
new Tuple<string, string>(
filepath.Substring(CommonInitFolder.Length).StartsWith("\\")
? filepath.Substring(CommonInitFolder.Length)
: "\\" + filepath.Substring(CommonInitFolder.Length),
" does not exist in image folder"));
}
_missingImageFolderEnteries.Sort((x, y) => y.Item1.CompareTo(x.Item1));
}
public static string FormatSubPath(string path, bool needsSlash = true)
{
var returnPath = path;
if (returnPath.StartsWith("."))
returnPath = returnPath.Substring(1);
if (!returnPath.StartsWith("\\") && needsSlash)
returnPath = "\\" + returnPath;
else if (returnPath.StartsWith("\\") && !needsSlash)
returnPath = returnPath.Substring(1);
return returnPath;
}
答案 0 :(得分:1)
Linq是一个抽象级别,所以它永远不会比手动循环更快。
至于您的问题,我会尝试将_imageFilesInFolderPathList
转换为包含文件名称的HashSet<string>
。此外,您还需要比较使用EndsWith
的整个字符串,以提高性能。