2011-02-19 97 views
0

我有一個巨大的文件路徑和文件擴展量來處理:.NET收集需要存儲的文件路徑和擴展

  • 每個文件路徑具有與之相關聯的只有一個文件擴展名。
  • 每個文件擴展名都有一個或多個與之關聯的文件路徑。
  • 路徑是唯一的,擴展名不是。

我的目標是輕鬆檢索與給定文件擴展名關聯的所有文件路徑。

例如,如果我問「mp3」,我想知道具有該擴展名的文件的所有路徑。

現在,我的問題是:我應該使用哪個C#集合來優化 這樣做,我應該如何使用該集合?

回答

5

我會使用Dictionary<string, List<string>>其中鍵將是擴展名(例如,「mp3」),它將返回類型.mp3文件路徑的列表。

如果你可以使用LINQ,你可以使用一個單一的List<string>和檢索特定文件擴展名喜歡此相關的文件路徑:

List<string> s = new List<string>(); 
s.Add("c:\\documents and settings\\sound1.mp3"); 
s.Add("c:\\documents and settings\\sound2.mp3"); 
s.Add("c:\\documents and settings\\sound3.mp3"); 
s.Add("c:\\documents and settings\\something1.wav"); 
s.Add("c:\\documents and settings\\something2.exe"); 
s.Add("c:\\documents and settings\\abc.MP3"); 

var mp3paths = s.Where(x => String.Compare(".mp3", Path.GetExtension(x), true) == 0); 
var exepaths = s.Where(x => String.Compare(".exe", Path.GetExtension(x), true) == 0); 
+0

良好的快速抽拉式,馬龍。以秒擊敗我。雖然我會建議IEnumerable 而不是List。 – 2011-02-19 01:44:17

+0

感謝你們兩位! IEnumerable優於List的優點是什麼? – asmo 2011-02-19 01:46:02

2

如果你只是尋找一個容器,以便容納所有的擴展名和文件路徑關係,我建議Dictionary(特別是Dictionary<string, List<string>>)。

這樣,您可以存儲每個文件擴展名的字符串列表(即文件路徑列表)。

var dictionary = new Dictionary<string, List<string>>(); 
dictionary.Add("exe", new List<string>()); 
dictionary["exe"].Add("C:\Test\MyApp.exe"); 
dictionary["exe"].Add("C:\Test\AnotherApp.exe"); 
//Etc... 

我希望這有助於!

2

到詞典的替代已經提到的是查找如果集合只需要設置一次,你希望它是一成不變的:

var myLookup = new DirectoryInfo(@"D:\samples").GetFiles() 
        .ToLookup(f => f.Extension); 
var videoFiles = myLookup[".wmv"].ToList();