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?我怎样才能做到这一点?

c# DirectoryInfo and Except

您正在比较DirectoryInfo实例。它们与通过对GetDirectories的不同调用返回的不同。

您可以为比较FullNameDirectoryInfo定义自己的比较器,并在对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方法重载来实现所需的输出。