2011-03-15 41 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