我试图从两个文件夹中使用Intersect方法获取相同的文件。 所有文件夹中的123.xml文件都是相同的(内容,日期,大小没有变化)。
Scores\Content\123.xml
Scores\Content\hi.xml
Scores\123.xml
Power\Content\123.xml
Power\Content\helo.xml
Power\123.xml
这是来自C#代码
System.IO.DirectoryInfo dir1 = new System.IO.DirectoryInfo(path1);
System.IO.DirectoryInfo dir2 = new System.IO.DirectoryInfo(path2);
IEnumerable<System.IO.FileInfo> list1 = dir1.GetFiles("*.*", System.IO.SearchOption.AllDirectories);
IEnumerable<System.IO.FileInfo> list2 = dir2.GetFiles("*.*", System.IO.SearchOption.AllDirectories);
FileCompare myFileCompare = new FileCompare();
bool areIdentical = list1.SequenceEqual(list2, myFileCompare);
if (areIdentical == true)
{
Console.WriteLine("the two folders are the same");
}
else
{
Console.WriteLine("The two folders are not the same");
}
var queryCommonFiles = list1.Intersect(list2, myFileCompare);
queryCommonFiles仅从Content文件夹返回123.xml,但不返回另一个。
这是FileCompare的代码
class FileCompare : System.Collections.Generic.IEqualityComparer<System.IO.FileInfo>
{
public FileCompare() { }
public bool Equals(System.IO.FileInfo f1, System.IO.FileInfo f2)
{
return (f1.Name == f2.Name &&
f1.Length == f2.Length);
}
// Return a hash that reflects the comparison criteria. According to the
// rules for IEqualityComparer<T>, if Equals is true, then the hash codes must
// also be equal. Because equality as defined here is a simple value equality, not
// reference identity, it is possible that two or more objects will produce the same
// hash code.
public int GetHashCode(System.IO.FileInfo fi)
{
string s = String.Format("{0}{1}", fi.Name, fi.Length);
return s.GetHashCode();
}
}
编辑:
var queryList1Only = (from file in list1
select file).Except(list2, myFileCompare);
Console.WriteLine("The following files are in list1 but not list2:\n");
foreach (var v in queryList1Only)
{
Console.WriteLine(v.FullName);
}
var queryList2Only = (from file in list2
select file).Except(list1, myFileCompare);
Console.WriteLine("The following files are in list2 but not list1:\n");
foreach (var v in queryList2Only)
{
Console.WriteLine(v.FullName);
}
这将生成list1的hi.xml和list2的helo.xml。正如我所说的交叉方法只有一个123.xml。
任何建议都将不胜感激
谢谢,
答案 0 :(得分:3)
我刚刚更改了Equals方法以获得所需的结果
class FileCompare : System.Collections.Generic.IEqualityComparer<System.IO.FileInfo>
{
public FileCompare() { }
public bool Equals(System.IO.FileInfo f1, System.IO.FileInfo f2)
{
return (f1.Name == f2.Name && f1.Directory.Name == f2.Directory.Name &&
f1.Length == f2.Length);
}
// Return a hash that reflects the comparison criteria. According to the
// rules for IEqualityComparer<T>, if Equals is true, then the hash codes must
// also be equal. Because equality as defined here is a simple value equality, not
// reference identity, it is possible that two or more objects will produce the same
// hash code.
public int GetHashCode(System.IO.FileInfo fi)
{
string s = String.Format("{0}{1}", fi.Name, fi.Length);
return s.GetHashCode();
}
}
答案 1 :(得分:2)
一切看起来都不错。确保Scores\123.xml
和Power\123.xml
的长度相同。
答案 2 :(得分:2)
因为您只使用FileInfo.Name和FileInfo.Length进行比较,所以Content \ 123.xml与123.xml相同(假设两个文件具有相同的大小,我猜你的测试数据就是这种情况)
因此,就FileCompare类而言,输入集合包含重复项。根据{{3}},Intersect会评估每个集合中的不同元素。