3

次のような条件文を書いていることがよくあります。

if(Path.GetExtension(filename) == ".pdf" || Path.GetExtension(filename)== ".doc")
{
    // do something
}

テストするファイル拡張子ごとに Path.GetExtension() を 1 回呼び出すのは、少し冗長に思えます。確かに、私は次のようなことができます:

string fileExtension = Path.GetExtension(filename);
if(fileExtension == ".pdf" || fileExtension == ".doc")
{
    // do something
}

しかし、比較のために fileExtension のみを使用していることを考えると、ファイル拡張子の変数を宣言することはあまりエレガントではないようです。

SQL では、IN 演算子を使用できます。

SELECT file FROM table WHERE fileExtension IN(".pdf", ".doc")

これにより、繰り返しなしでテストを実行できます。

C# は、比較対象の変数や等値演算子を繰り返す必要がない、SQL の in に似たシンタックス シュガーを提供しますか?

4

5 に答える 5

8

新しい配列をインラインで作成して呼び出すだけContainsです:

if((new[]{ ".pdf", ".doc"}).Contains(fileExtension))
{
    // Do Something
}
于 2012-07-05T18:22:09.617 に答える
3

読みやすさを気にするなら、

switch (fileExtension)
{
    case ".pdf":
    case ".doc":
        // do something                
        break;
}

また、他の拡張機能を別の方法で処理する必要がある場合の将来の証明にもなります。

于 2012-07-05T18:30:43.643 に答える
1

ジャスティンの答えは確かにそれをするでしょう. しかし、私にはやり過ぎのようです。確かに、コレクション内で比較対象の拡張機能を既に持っていない限り、2 番目の例のように単純に直接比較するよりもかなり効率が悪いようです。(あなたの最初の例は悪いアプローチ IMO です。)

ただし、2 番目の例のように結果を変数に格納すると、非常に効率的であることに注意してください。変数が後続の比較でのみ使用される場合、コンパイラーが実行できるあらゆる種類の最適化があります。変数を作成する必要さえないかもしれません。

于 2012-07-05T18:23:56.210 に答える
1

あなたはすでに解決策を受け入れているようですが、あなたの意図により近いと思うので、私の解決策を提出したいと思います。

public static bool In(this object source, params object[] collection)
{
    return collection.Contains(source);
}

使用法:

if(Path.GetExtension(filename).In(".pdf", ".doc"))
{
    //Do something
}

それが役立つことを願っています。

編集:「GetExtension」がどのように機能するかを正確に反映するために、ファイル拡張子にピリオドを追加しました。

于 2012-07-31T22:32:16.173 に答える
0

本当に SQL 演算子のように読みたい場合は、拡張メソッドを使用できます。

public static bool In(this object o, IEnumerable c)
{
    foreach (object i in c)
    {
        if (i.Equals(o))
        {
            return true;
        }
    }
    return false;
}

使用法:

string fileExtension = ".pdf";
string[] acceptedFileExtensions = new[] { ".pdf", ".doc" };

if (fileExtension.In(acceptedFileExtensions))
{
    // Do something
}
于 2012-07-05T18:33:43.733 に答える