Я строю древовидную структуру со списком ScanItem. Класс ScanItem на самом деле:
public class ScanItem
{
public string FullPath { get; set; }
public string Name
{
get
{
return Path.GetFileName(FullPath);
}
}
public DateTime ModifiedDate { get; set; }
public DateTime CreatedDate { get; set; }
public FileAttributes Attributes { get; set; }
public bool IsDirectory { get; set; }
public string Extension
{
get
{
if (IsDirectory)
return "Folder";
else
return Path.GetExtension(Name);
}
}
public UInt64 Size { get; set; }
}
Чтобы создать древовидную структуру, мне нужно было создать два других класса, чтобы различать папки и файлы в древовидной структуре:
public class ScanFile : ScanItem
{
}
public class ScanDir : ScanItem
{
public List<ScanItem> Items { get; set; }
public ScanDir()
{
Items = new List<ScanItem>();
}
}
Обратите внимание, что класс ScanFile аналогичен классу ScanItem, а класс ScanDir имеет дополнительное свойство, называемое Items, и будет содержать собственный список элементов.
Так что, если я перебираю эту директорию (C: \ Temp):
Мой список будет содержать:
обратите внимание, что если я разверну один объект ScanDir, я получу другой список:
для того, чтобы заполнить следующее древовидное представление:
Таким образом, я смог заполнить этот список с помощью рекурсии, выполнив поиск файлов и каталогов по определенному пути.
Я просто хотел объяснить мою ситуацию, потому что в Интернете есть несколько мест, которые позволяют вам фильтровать древовидную структуру, и это то, что я действительно хочу сделать. Но было бы хорошо, если бы я мог перебирать каждый элемент в Списке, а затем удалять его, если некоторые критерии не выполнены:
На самом деле я пытался использовать следующий рекурсивный метод для фильтрации своих результатов.
public List<ScanItem> search(List<ScanItem> items)
{
var filter = new List<ScanItem>();
foreach (var item in items)
{
if (!item.FullPath.Contains("stringIwantToLookFor")) continue;
filter.Add(item);
if (item.IsDirectory)
{
search(((ScanDir)item).Items);
}
}
return filter;
}
Я думаю, что если элемент найден, мне нужно добавить все родительские корневые каталоги, и поэтому он не работает. Причина, по которой я хочу создать свой собственный метод рекурсии, заключается в том, что я хочу иметь возможность фильтровать древовидное представление на основе специальных критериев.
EDIT:
Другими словами, если я хочу, чтобы все элементы, содержащие «X.txt», в моем списке, я просто хотел увидеть: