我有一些形式的文件:
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
个文件,然后过滤掉最后两个部分,只有名称存在,如"blur", "soften", "median"
等。
某些着色器效果可以包含更多或更少的类型,因此我不想硬编码.static.shadereffect
。
所以最后该方法将返回.shadereffect
文件的名称:
{"blur", "soften", "median"}
如何使用尽可能少的代码最优雅地完成此操作?表现并不重要。
编辑:一个小细节。文件名也可以有两个以上的点,所以像“blur.sharpen.dynamic.shadereffect”这样的东西,不应该抛弃结果。
答案 0 :(得分:3)
我只会对每个文件名使用string.Split
,然后使用Distinct
:
files
.Select( filename => filename.Split( '.' )[0] )
.Distinct()
虽然,我必须承认,这可能不是最有效的方式。如果你有很多点的长名称,这将浪费一些记忆和时间。更好的方法是将字符串的一部分明确地带到第一个点:
files
.Select( filename => new string( filename.TakeWhile( c => c != '.' ).ToArray() ) )
.Distinct()
答案 1 :(得分:1)
我没有对它进行测试,所以某处可能会有一些错误的错误。但是这应该选择除了每个字符串的最后两个部分之外的所有内容。
files
.Select( s=>
{
int dot1=s.LastIndexOf(".");
int dot2=s.LastIndexOf(".",dot1-1);
s.SubString(0,dot2-1);
}
)
.Distinct()