簡體   English   中英

C#比較速記

[英]C# Comparison shorthand

我有這個代碼:

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

是否有某種形式的速記,以便我可以像這樣重寫它?

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

功能應該完全相同。 我只是在找一些看起來不那么混亂的東西。

編輯很抱歉沒有澄清,所有變量都是整數。 我正在尋找一種更短的方法來確保abcd ,......都等於y

你最接近的(沒有實現你自己的機制):

if (new[] { a, b, c, d }.All(value => y == value))
    // ...

,沒有什么可以簡化您的代碼而不會超過可讀性優勢而導致性能損失很大。


編輯: 高性能解決方案

如果您非常渴望嘗試高性能解決方案,請參閱以下內容:

(更新:顯然我認為你可以在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));

警告:人們可能會因為這樣做而對你大喊大叫,所以使用它需要你自擔風險。 :)

稍微更具可讀性(在我看來)是:

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

但是我不相信基礎語言中有任何東西。

如果你真的想要你所建議的東西,這就是函數的用途,例如:

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

但你可能要在性能方面小心謹慎。


如果在a/b/c/d/...不變的循環中完成(換句話說,只有y在變化的情況下),有一件事可能對你有用。

檢查循環外不變量的相等性:

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

因為,如果不是這樣,那么y永遠不會等於所有這些。 然后,在循環內部,只需:

if (y == a)

事實上,你已經知道,所有的非y變量彼此相等,意味着你只需要檢查y對他們中的一個。

但是,由於我沒有看到您的完整代碼,我不確定它是否對您有用。


我應該提一下,雖然詳細,但你的原始代碼實際上並不可讀,特別是如果它的格式很好。 即使是龐然大物:

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))
{
    ...
}

是可讀的(雖然我不是簡潔變量名的忠實粉絲)。

當然,在這一點上,您可能希望研究使用帶循環的數組而不是奇異變量。

不,沒有。 堅持你所擁有的。

好吧,你可以寫一個public static bool AllEqual<T>(params T[] values) (可能有2/3/4/5操作數的重載以避免數組創建),但我不確定它是否值得大部分時間。

嘗試這個:

假設你正在比較字符串

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
new[] { a, b, c, d }.Contains(y)

雖然不可能確定,但​​我會查看您的整體代碼結構,看看是否有更好的方法來處理整個區域。

每當你有一個像那樣重復的模式時,你可能需要對它進行很多修改。 您可能需要添加新的q == y或最終更改某些內容。

這里很多人都關心性能,但確保你的代碼可維護,易懂和適當考慮因素更為重要。

作為總猜測,我會說你的a,b,c,d變量都應該是4個不同對象的成員,ax,bx,cx,dx a,b,c,d代表什么? 它們不能只是任意數字,它們是價格或像素位置或元素的權重 - 一些東西! 我無法想象你有4個而且從不5或3個東西的情況。

無論如何,無論它代表什么,可能還有其他與之相關的東西 - 名稱,大小,顏色,控制指數 - 無論如何。

一般來說,我會看一個更高級別來解決這個問題。 我要說至少a,b,c&d應該是在程序之外定義的東西,無論是在數據文件還是數據庫中。

對於if(y == a && y == b && y == c && y == d) ,請使用:

if(y == a == b == c == d){// code here}

對於if(y == a || y == b || y == c || y == d)且y是簡單類型或字符串,請使用:

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

}
   bool  x=true ,y=true, z=true, p = true;

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

    x = false;
    if (x == (y == z == p)) //false

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM