3

私はこのコードを持っています:

    if (y == a && y == b && y == c && y == d ...)
    {
        ...
    }

このようなものに書き直すことができるような速記の形式はありますか?

    if(y == (a && b && c && d ...))
    {
        ...
    }

機能はまったく同じである必要があります。あまり混乱しないように見えるものを探しているだけです。

編集明確にしておらず申し訳ありません。すべての変数は整数です。a, b, c, d... すべてが等しいことを確認するためのより短い方法を探していyます。

4

9 に答える 9

10

あなたが得ようとしている最も近いもの(独自の種類のメカニズムを実装せずに):

if (new[] { a, b, c, d }.All(value => y == value))
    // ...
于 2011-01-18T00:02:21.233 に答える
4

いいえ、コードを単純化して、読みやすさのメリットを大きく犠牲にしてパフォーマンスを低下させるものはありません。


編集:高性能ソリューション

どうしても高性能なソリューションを試す必要がある場合は、次の 1 つを試してみてください。

(更新: どうやら、varargs でジェネリックを使用できると考えるのは間違っていたようです。明らかに型をハードコードすることしかできないようです。そのため、int代わりに以下の型を変更しましたが、同じコードが適用されます。)

static bool AllEqual(int value, __arglist)
{
    for (var ai = new ArgIterator(__arglist); ai.GetRemainingCount() > 0; )
    {
        var next = __refvalue(ai.GetNextArg(typeof(int).TypeHandle), int);
        if (!value.Equals(next)) { return false; }
    }
    return true;
}

次に、次のように呼び出してみてください。

//...
bool equal = AllEqual(1, __arglist(1, 1, 1));

警告: これを行うと怒鳴られる可能性があるため、自己責任で使用してください。:)

于 2011-01-18T00:02:02.827 に答える
3

(私の意見では)もう少し読みやすいです

if ((y == a) && (y == b) && (y == c) && (y == d) ...)

しかし、私はこれの基本言語には何もないと思います。

提案したもののようなものが本当に必要な場合は、それが関数の目的であり、次のようなものです。

if (isSetToAll (y, a, b, c, d, ...))

ただし、パフォーマンスの面では注意が必要な場合があります。


それが不変である(言い換えれば、変化しているだけである)ループで行われている場合、1つのことが役立つかもしれません。a/b/c/d/...y

ループ外の不変量が等しいかどうかを確認します。

if ((a == b) && (a == c) && (a == d) ...)

そうでない場合は、yそれらすべてに等しくなることは決してないからです。次に、ループ内で次のようにします。

if (y == a)

yすべての非変数が互いに等しいことをすでに知っているという事実はy、それらの1つに対してチェックするだけでよいことを意味します。

しかし、私はあなたの完全なコードを見たことがないので、それがあなたに役立つかどうかはわかりません。


冗長ではありますが、元のコードについて実際に読めないものは何もありません。特に、適切にフォーマットされている場合はそうです。巨大なものでさえ:

if ((y == a) && (y == b) && (y == c) && (y == d) &&
    (y == e) && (y == f) && (y == g) && (y == h) &&
    (y == i) && (y == j) && (y == k) && (y == l) &&
    (y == m) && (y == n) && (y == o) && (y == p) &&
    (y == q) && (y == r) && (y == s) && (y == t) &&
    (y == u) && (y == v) && (y == w) && (y == x))
{
    ...
}

読みやすいです(私は簡潔な変数名の大ファンではありませんが)。

もちろん、その時点で、特異変数ではなくループ付きの配列の使用を検討することをお勧めします。

于 2011-01-18T00:05:01.683 に答える
2

いいえ、ありません。あなたが持っているものに固執する。

public static bool AllEqual<T>(params T[] values)ええと、 (配列の作成を避けるために2/3/4/5オペランドのオーバーロードを使用して)を書くことはできますが、ほとんどの場合、それが価値があるかどうかはわかりません。

于 2011-01-18T00:03:36.710 に答える
1

これを試して:

文字列を比較していると仮定します

IList<string> valuesToCompare = new List<string> { "a", "b", "c", "d" };

if (valuesToCompare.Any(valueToCompare => valueToCompare != y)) 
       //If there is any value that is not equal to y
       //Do something
于 2011-01-18T00:04:05.290 に答える
0

確かなことは言えませんが、全体的なコード構造を調べて、その領域全体を処理するためのより良い方法がないかどうかを確認します。

このように繰り返されるパターンがある場合はいつでも、おそらくそれを何度も変更する必要があります。新しい q==y を追加するか、最終的に何かを変更する必要がある可能性があります。

ここにいる多くの人はパフォーマンスに関心を持っていましたが、コードが保守可能で理解しやすく、適切に分解されていることを確認することがはるかに重要です。

全体的な推測として、a、b、c、d 変数はすべて、4 つの異なるオブジェクト ax、bx、cx、dx のメンバーである必要があると思います。a、b、c、d は何を表しているのでしょうか。それらは単なる任意の数値ではありません。価格、ピクセル位置、または要素の重量などです。何かがちょうど 4 つあり、5 つまたは 3 つがないという状態は想像できません。

いずれにせよ、それが何を表しているにせよ、名前、サイズ、色、コントロール インデックスなど、おそらく他に関連付けられているものがあります。

一般に、この問題の修正については、より高いレベルを検討します。少なくとも a,b,c & d は、データ ファイルまたはデータベースのいずれかで、プログラムの外部で定義されたものである必要があります。

于 2011-01-18T00:41:03.027 に答える
0
new[] { a, b, c, d }.Contains(y)
于 2011-01-18T00:00:54.380 に答える
-1

if (y == a && y == b && y == c && y == d)の場合、次を使用します。

if ( y == a == b == c == d) { //コードはここに }

(y == a || y == b || y == c || y == d)で、y が単純型または文字列の場合は、次を使用します。

switch(y)
{
   case a:
   case b:
   case c:
   case d:
     //your code here
     break;

}
于 2011-01-18T00:01:01.173 に答える
-3
   bool  x=true ,y=true, z=true, p = true;

    if (x == (y == z == p)) //true

    x = false;
    if (x == (y == z == p)) //false
于 2011-01-18T00:10:14.597 に答える