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)干杯.
你可以使用这个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.