2011-03-15 29 views
0

我在形式的一些文件:如何讓這些文件儘可能優雅?

blur.static.shadereffect 
blur.dynamic.shadereffect 
blur.virtual.shadereffect 

soften.static.shadereffect 
soften.dynamic.shadereffect 
soften.virtual.shadereffect 

median.static.shadereffect 
median.dynamic.shadereffect 
median.virtual.shadereffect 

... 

現在我正在.static.shadereffect文件,然後過濾掉最後2個部分,從而只有名稱存在類似"blur", "soften", "median"

一些着色器效果可以有更多或更少的類型,所以我不想硬編碼.static.shadereffect

那麼到底該方法將返回.shadereffect文件的名稱:

{"blur", "soften", "median"} 

如何用盡可能少的代碼儘可能做到這一點最優雅?性能並不重要。

編輯:一個小細節。文件名也可以有2個以上的點,所以像「blur.sharpen.dynamic.shadereffect」,這不應該扔掉結果。

回答

3

我只想用string.Split每個文件名,然後Distinct

files 
    .Select(filename => filename.Split('.')[0]) 
    .Distinct() 

雖然,我必須承認,這可能不是最有效的方式。如果你的名字長得多點,這會浪費一些記憶和時間。更好的辦法是明確把字符串的一部分到第一點:

files 
    .Select(filename => new string(filename.TakeWhile(c => c != '.').ToArray())) 
    .Distinct() 
+0

謝謝我可能會使用這個,但如果有更多的點,那麼這不會給正確的結果,對不對?它沒有超過2個點,但我在想如果它。 – 2011-03-15 22:42:31

+0

@Joan Venge:是​​的,這將適用於任意數量的點,包括零點。它會給你第一個單詞(即第一個點之前的字符串部分),而不管有多少單詞。 – 2011-03-15 22:44:17

+0

謝謝你們,我明白你的意思。我主要想要獲得所有點的全名,除了每個獨特元素的xxx.shadereffect。但我想我不應該試圖通過爲實際名稱本身設置任意數量的點來使其更具通用性。 – 2011-03-15 22:48:08

1

我沒有測試它,所以可能有一些關閉的情況的一個錯誤的地方。但是這應該選擇除了每個字符串的最後兩部分之外的所有內容。

files 
    .Select(s=> 
     { 
     int dot1=s.LastIndexOf("."); 
     int dot2=s.LastIndexOf(".",dot1-1); 
     s.SubString(0,dot2-1); 
     } 
    ) 
    .Distinct() 
+0

謝謝你,這也很有趣。 – 2011-03-15 23:15:53