使用LINQ C#比较List <FileInfo>中的文件

Mas*_*ick 0 c# linq compare file list

我有两个文件集合List<FileInfo>.我目前正在使用2 x foreach循环遍历每个集合并匹配文件(如下所示).有没有更快的方法在LINQ和.RemoveAt找到时这样做.?

  • 我需要文件名和文件长度匹配.

            var sdinfo = new DirectoryInfo(srcPath);
            var ddinfo = new DirectoryInfo(dstPath);
    
            var sFiles = new List<FileInfo>(sdinfo.GetFiles("*", SearchOption.AllDirectories));
            var dFiles = new List<FileInfo>(ddinfo.GetFiles("*", SearchOption.AllDirectories));
    
            foreach (var sFile in sFiles)
            {
                bool foundFile = false;
                int i = 0;
    
                foreach (var dFile in dFiles)
                {
                    if (sFile.Name == dFile.Name && sFile.Length == dFile.Length)
                    {
                        foundFile = true;
                        dFiles.RemoveAt(i);
                    }
                    i += 1;
                }
            }
    
    Run Code Online (Sandbox Code Playgroud)

干杯.

Dmi*_*try 5

你可以使用这个Enumerable.Except<TSource>方法:

private class FileInfoComparer : IEqualityComparer<FileInfo>
{
    public bool Equals(FileInfo x, FileInfo y)
    {
        return x == null ? y == null : (x.Name.Equals(y.Name, StringComparison.CurrentCultureIgnoreCase) && x.Length == y.Length);
    }

    public int GetHashCode(FileInfo obj)
    {
        return obj.GetHashCode();
    }
}

sFiles = sFiles.Except(dFiles, new FileInfoComparer()).ToList();
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,你得到的所有文件sFiles是在缺席dFiles.