私はScanItemのリストとツリービューを構築していてHierarchicalDataて検索します。 ScanItemのクラスは、実際にある:私は私のツリービュー内のフォルダやファイルを区別するために、2つの他のクラスを作成するために必要なツリービューを作成するために再帰
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クラスは、アイテムと呼ばれる余分な性質を持っており、自身の項目のリストが含まれます。
だから私、このdirecotoryを反復処理する(C:\ Tempに):もし
私のリストが実際に含まれています:
ノートを私は1つの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;
}
私はアイテムが発見された場合、私はすべての親のルートディレクトリを追加する必要があると思いますし、それが動作しない理由です。私はspesific基準に基づいて、ツリービューをフィルタリングすることができるようにしたいので、私は私自身の再帰方法を構築したい理由があります。
EDIT:つまり
私は私のリストビューで「X.TXT」を含むすべてのアイテムを持っているしたい場合、私はちょうど見たい:
"IsDirectory"チェックはコード "匂い"です。処理しているオブジェクトのタイプに基づいて条件付きロジックを使用して動作を定義することは多態性ではなく、頻繁に積極的に使用すると読みにくく、保守が難しいコードになります。検索に対処するには、「訪問者」のデザインパターンを調べる方がよいでしょう。 –