2014-09-28 22 views
1

基本上,我有一個ComboBox,我想用特定的Directory填充File Extensions使用目錄中的每個文件類型填充組合框

目前,我使用的是:

Dim dir = "C:\" 
For Each file As String In System.IO.Directory.GetFiles(dir) 
    cmb_FileTypes.Items.Add(System.IO.Path.GetExtension(file)) 
Next 

這並不正確,因爲它基本上加載所有的擴展目錄中的所有文件工作。我想讓它顯示每個ONE文件類型。舉例來說,如果有10個文件:

  • File1.jpg
  • File2.jpg
  • File3.png
  • File4.mp3
  • File5.mp3
  • File6.dat
  • File7.dat
  • File8.tif
  • File9.jpg
  • File10.mp3

在這些10個文件,有6個文件擴展名是不同的文件擴展名:

  • .jpg的
  • MP3播放
  • tif

如何將每個1這些文件擴展名加載到ComboBox中,而不是僅僅重複它?

回答

1

你可以使用LINQ到羣中的分機

For Each file As String In Directory.GetFiles(dir).[Select](Function(p) Path.GetExtension(p)).Distinct().OrderBy(Function(p) p).ToList() 
    cmb_FileTypes.Items.Add(System.IO.Path.GetExtension(file)) 
Next 

,或者你可以創建一個返回List<string>含有獨特的擴展方法。

Public Function UniqueExtensions(filenames As String()) As List(Of String) 
    Dim extSet As New HashSet(Of String)(StringComparer.OrdinalIgnoreCase) 
    For Each file As String In filenames 
     extSet.Add(System.IO.Path.GetExtension(file)) 
    Next 
    Return extSet.ToList() 
End Function 
+0

由於'List'不是'System.Linq.IOrderedEnumerable(Of String)'的成員,因此無法工作。爲什麼這麼說? – Zer0 2014-09-28 09:54:30

+0

改爲嘗試'ToList()'。對不起,我不使用VB.NET,所以它是從'C#'的翻譯 – keyboardP 2014-09-28 09:55:59

+0

謝謝@keyboardP正是我所需要的。 – Zer0 2014-09-28 10:01:26

2

使用LINQ在一個批量中添加組合框的所有擴展名。

cmb_FileTypes.Items.AddRange((From name In Directory.GetFiles(dir) Select Path.GetExtension(name).Replace(".", "") Distinct).ToArray()) 
+0

感謝您的輸入好友,但keyboardP使用LINQ並將其運用! – Zer0 2014-09-28 10:01:57

+0

對不起,不是第一次發佈,但在發佈之前需要一些時間來測試代碼。順便說一下,'AddRange'是添加多個項目的首選方式,我敢打賭你不希望這些時間段被包含在分機列表中。 – 2014-09-28 10:04:52

+0

是的,你是對的,你的代碼也可以工作!如果你是第一個我願意給它,但我也會爲你的使用。請記住你也幫助過我! – Zer0 2014-09-28 10:27:23