Операция разности двух массивов 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();
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д