子路径字符串列表与FileInfo列表相比较

时间:2017-12-07 13:21:29

标签: c# compare

我有以下方法将子路径的列表(行)与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;
}

1 个答案:

答案 0 :(得分:1)

Linq是一个抽象级别,所以它永远不会比手动循环更快。

至于您的问题,我会尝试将_imageFilesInFolderPathList转换为包含文件名称的HashSet<string>。此外,您还需要比较使用EndsWith的整个字符串,以提高性能。