我执行以下代码,结果令我费解
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 folders...why不是5?我怎样才能做到这一点?
发布于 2014-04-10 08:03:02
您正在比较DirectoryInfo实例。它们与对GetDirectories的不同调用返回的不一样。
您可以为DirectoryInfo比较FullName定义自己的比较器,并在调用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();发布于 2014-04-10 08:03:14
您需要提供一个自定义比较器,您可以看到这种行为,因为它被测试为与“引用比较”相等,当然它们是不同的引用。
使用除方法过载外,该方法以IEqualityComparer为参数来实现所需的输出。
https://stackoverflow.com/questions/22982042
复制相似问题