我正在構建一個帶有ScanItem列表的樹形視圖。類ScanItem的居然是:通過遞歸搜索HierarchicalData
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; }
}
爲了讓我創造一個TreeView,我需要爲了區別在我的樹視圖中的文件夾和文件來創建其他兩個類:
public class ScanFile : ScanItem
{
}
public class ScanDir : ScanItem
{
public List<ScanItem> Items { get; set; }
public ScanDir()
{
Items = new List<ScanItem>();
}
}
注意ScanFile類與ScanItem類似,ScanDir類具有一個名爲Items的額外屬性,並將包含其自身的項目列表。
所以,如果我在哪裏可以通過這個direcotory迭代(C:\ TEMP):
我的列表實際上將包含:
需要注意的是,如果我展開一個SCANDIR對象我會得到另一個列表:
以填充日E採用樹狀:
所以我能夠填充使用遞歸通過在特定的路徑搜索文件和目錄此列表。
我只是想解釋我的情況,因爲互聯網中有幾個地方可以過濾樹狀視圖,而這正是我真正想要做的。但是,如果我可以遍歷列表中的每個項目,然後在不符合某些條件時將其刪除,那將會很好:
我實際上已嘗試使用以下遞歸方法來篩選我的結果。
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;
}
我認爲,如果找到一個項目,我需要添加所有的父根目錄,這就是爲什麼它不起作用。我想構建自己的遞歸方法的原因是因爲我希望能夠根據特定條件過濾樹視圖。
編輯:
換句話說,如果我想有所有包含「X.txt」在我的列表視圖我想剛纔看到的項目:
「IsDirectory」檢查是一個代碼「氣味」。使用基於您正在處理的對象類型的條件邏輯來預測行爲不是多態的,而且過於頻繁且積極地使用,會導致難以閱讀和難以維護的代碼。您最好查看「訪問者」設計模式來解決搜索問題。 –