Операция разности двух массивов FileInfo - C#
Формулировка задачи:
Здравствуйте!
Есть два массива FileInfo. К примеру f1 и f2. Нужно найти разность этих массивов и потом в цикле вывести имена этих файлов. Используя метод Except класса Enumerable, в результате разность не определяется.
Вот такой код: не работает. В результате получается исходный массив со всеми элементами. Вопрос: почему так и как сделать так, чтобы это работало?
Спасибо!
f = f1.Except(f2);
Решение задачи: «Операция разности двух массивов FileInfo»
textual
Листинг программы
class Program
{
static void Main(string[] args)
{
DirectoryInfo dir = new DirectoryInfo("C:\\");
var all = dir
//папки диска "С"
.GetDirectories()
//отбрасывам системные
.Where(d => (d.Attributes & FileAttributes.System) == 0)
//получаем папки второго уровня
.Aggregate(Enumerable.Empty<DirectoryInfo>(),
(list, newDir) => list.Concat(newDir.GetDirectories()));
//папки диска "С"
var first = dir.GetDirectories()
//находим первую несистемную
.First(d => (d.Attributes & FileAttributes.System) == 0)
//получам из нее дочерние директории
.GetDirectories();
//Intersect - пересечиние множеств - то, что Вам нужно
//При пересечении множеств всех папок и первой,
//остаются только дети первой
foreach(var d in all.Intersect(first, new FileSystemInfoComparer()))
Console.WriteLine(d);
Console.ReadKey();
}
}
//класс для сравнения папок и файлов,
//который для сравнения использует только полный путь
//з.ы. неуверен, надежный ли это подход, но исправить несложно
class FileSystemInfoComparer : IEqualityComparer<FileSystemInfo>
{
public bool Equals(FileSystemInfo f1, FileSystemInfo f2)
{
return f1.FullName == f2.FullName;
}
public int GetHashCode(FileSystemInfo fsi)
{
return fsi.FullName.GetHashCode();
}
}