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」のようなものを使用すると、結果が失われることはありません。

4

2 に答える 2

3

string.Split各ファイル名に使用するだけで、次のようになりDistinctます。

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

認めざるを得ませんが、これは最も効率的な方法ではないかもしれません。ドットの多い長い名前の場合、メモリと時間が無駄になります。より良い方法は、文字列の最初のドットまでの部分を明示的に取得することです。

    files
    .Select( filename => new string( filename.TakeWhile( c => c != '.' ).ToArray() ) )
    .Distinct()
于 2011-03-15T22:40:11.107 に答える
1

私はそれをテストしていないので、どこかにオフバイワンのバグがあるかもしれません. ただし、これにより、各文字列の最後の 2 つの部分を除くすべてが選択されます。

files
    .Select( s=> 
      {
         int dot1=s.LastIndexOf(".");
         int dot2=s.LastIndexOf(".",dot1-1);
         s.SubString(0,dot2-1);
      }
     )
    .Distinct()
于 2011-03-15T23:11:03.067 に答える