c# DirectoryInfo and Except
本文关键字:Except and DirectoryInfo | 更新日期: 2023-09-27 17:57:39
我执行以下代码,结果让我很困惑
System.IO.DirectoryInfo rootDir =
new System.IO.DirectoryInfo(@"''share'data");
// AllDir == 10 folders
System.IO.DirectoryInfo[] AllDir =
rootDir.GetDirectories("*.*", SearchOption.AllDirectories);
// JackDir == 2 folders
System.IO.DirectoryInfo[] JackDir =
rootDir.GetDirectories("Jack*.*", SearchOption.AllDirectories);
// MaryDir == 3 folders
System.IO.DirectoryInfo[] MaryDir =
rootDir.GetDirectories("Mary*.*", SearchOption.AllDirectories);
System.IO.DirectoryInfo[] otherDirectory =
AllDir.Except<DirectoryInfo>(MaryDir).Except(JackDir).ToArray();
而otherDirectory
最终仍有10个文件夹。。。为什么不是5?我怎样才能做到这一点?
您正在比较DirectoryInfo
实例。它们与通过对GetDirectories
的不同调用返回的不同。
您可以为比较FullName
的DirectoryInfo
定义自己的比较器,并在对Except
的调用中使用它。
public class DirectoryInfoComparer : IEqualityComparer<System.IO.DirectoryInfo>
{
public bool Equals(System.IO.DirectoryInfo x, System.IO.DirectoryInfo y)
{
if (object.ReferenceEquals(x, y))
return true;
if (x == null || y == null)
return false;
return x.FullName == y.FullName;
}
public int GetHashCode(System.IO.DirectoryInfo obj)
{
if (obj == null)
return 0;
return obj.FullName.GetHashCode();
}
}
System.IO.DirectoryInfo[] otherDirectory =
AllDir.Except<DirectoryInfo>(MaryDir, new DirectoryInfoComparer()).Except(JackDir, new DirectoryInfoComparer()).ToArray();
您需要提供一个自定义比较器,您可以看到这种行为,因为它是根据"引用比较"测试的,当然它们是不同的引用。
使用以IEqualityComparer
为参数的Except方法重载来实现所需的输出。