2011-07-13 10 views
2

すべてのパスをベースパスでフィルタリングする最も効率的でエレガントな方法は何ですか?基本パスでパスリストをフィルタリングする最も効率的でエレガントな方法は何ですか?

私はパスリストおよびベースパスを持っている、と私はベースパスの子であるパスのリストを取得したい:

public IList<string> FilterPathList(IList<string> paths, string basePath) 
{ 
    // return a list of paths that are children of the base path 
} 

サンプル入力:期待

c:\foo\bar\file1 
c:\foo\bar\file2 
c:\foo\bar\dir1\file11 
c:\foo\bar\dir2\file 
c:\foo\other\file1 

Base path -> c:\foo\bar 

を出力:

c:\foo\bar\file1 
c:\foo\bar\file2 
c:\foo\bar\dir1\file11 
c:\foo\bar\dir2\file 

答えて

4

のような何か:

paths.Where(p => p.StartsWith(basePath)).ToList();

大文字と小文字を区別しない比較を行うには、もちろん大文字小文字を正規化しない限り、大文字と小文字を区別したい場合があります。

リストにある場合は、これもベースパスを返します。

+0

これはケーシングや\ vs /を考慮に入れません!検討してください:http://stackoverflow.com/questions/3660205/is-there-a-method-to-determine-if-a-file-path-is-nested-within-a-directory-path-i –

+0

@Strilanc私はそれがケーシングを考慮に入れないと言ったが、問題は、エレガントな方法をリストを横断することです、どこのコンテンツを拡大することができます。また、質問には、スキャンしている入力のタイプが明示され、スラッシュは使用されません。 –

+0

申し訳ありませんが、私はケーシングノートを見るには速すぎます。ただし、パスには特定のセパレータを使用することが保証されているとは言えません(例では1つしか使用できません)。たとえそれが述べられていたとしても、それは危険な前提です。 –

3

(パラレル)-LINQを使用する:

public IList<string> FilterPathList(IList<string> paths, string basePath) 
{ 
    var result = from s in paths.AsParallel() 
       where s.StartsWith(basePath) 
       select s; 
    return result.ToList(); 
} 

AsParallel()は、複数のスレッド(十分な大きさと> 1つのCPUの場合)で作業を行うので、それは速くなりますが、それは/変更されることができることを認識する必要がありますリストの順序

+0

[AsOrdered()](http://msdn.microsoft.com/en-us/library/system.linq.parallelenumerable.asordered.aspx)を使用していない限り。 – bzlm

関連する問題