2012-07-11 12 views
10

मैं सोच रहा था कि यह संभव था क्योंकि मैंने कोड की रेखाओं को कम करने के लिए टर्नरी ऑपरेटरों का उपयोग शुरू किया और मैं इसे प्यार कर रहा हूं।अगर कैसे टर्नरी ऑपरेटर में तर्क हो तो कैसे चालू करें?

if (x==y) 
{ 
    z += x; 
} else if (x==z) 
{ 
    z += y; 
} else { 
    z += 1; 
} 

मैं वहाँ है अगर केवल एक ही है, तो इस तरह का बयान इस अब कर सकते हैं:

z = x == y ? z += x : z += 1; 
+17

"मैं त्रिगुट ऑपरेटर का उपयोग करके कोड की लाइनों को कम करने के लिए शुरू कर दिया और मैं इसे प्यार कर रहा हूँ" उह ओह। – BoltClock

+0

ठीक है अगर केवल एक ही निर्देश है तो आप ब्रेसिज़ को हटा सकते हैं। और यह टर्नरी से ज्यादा पठनीय है। इमो – Maresh

+0

@ बोल्टक्लॉक बस यह कहने के बजाय, क्या आप समझा सकते हैं कि यह क्यों बुरा है? मैं हमेशा सुनने के लिए तैयार हूँ। –

उत्तर

26

यह इस तरह होगा:

z = 
    x == y ? z + x : 
    x == z ? z + y : 
    z + 1; 

आप एक संकार्य यह z = (z += x) कर खत्म हो जाएगा के रूप में z += x का उपयोग करते हैं। हालांकि यह इस विशेष मामले में काम करता है, क्योंकि z += x अभिव्यक्ति के परिणाम z का अंतिम मान है, यह अन्य मामलों में काम नहीं कर सकता है। , हालांकि सावधानी से

z += 
    x == y ? x : 
    x == z ? y : 
    1; 

उपयोग:

Howver, के रूप में सभी कार्यों को आम में z += है, तो आप इस तरह कर सकते हैं। कोड अक्सर अधिक पठनीय और रखरखाव आसान होता है, और घोंसला सशर्त संचालन बहुत पठनीय नहीं होते हैं। इसके अलावा, केवल तभी उपयोग करें जब आपके पास सशर्त ऑपरेशन के परिणामस्वरूप अभिव्यक्ति है, यह if कथन के लिए ड्रॉप-इन प्रतिस्थापन नहीं है।

+0

धन्यवाद, यह कमाल है! –

5

आप

z += x == y ? x : x == z ? y : 1; 

लेकिन ईमानदारी से उपयोग कर सकते हैं, कि तुम क्या की तुलना में वास्तव में अधिक पठनीय नहीं है पहले था आप जोड़ने कोष्ठकों द्वारा यह थोड़ा स्पष्ट कर सकते हैं:

z += x == y ? x : (x == z ? y : 1); 

लेकिन आम तौर पर मैं जब तक जब गोल्फ नेस्टेड सशर्त ऑपरेटरों से दूर रहना चाहते हैं।

+10

"कर सकते हैं"। लेकिन कृपया मत करो। –

+0

कुछ न्यायसंगत न्यूलाइन के साथ, मुझे लगता है कि यह मूल से अधिक * पठनीय * हो सकता है। – recursive

+0

माइकल: सहमत; इसके लिए एक नोट जोड़ा। रिकर्सिव: मैंने इसे कई लाइनों पर स्वरूपित करने की कोशिश की लेकिन इसे और अधिक समझने में असफल रहा। शायद मैं बस चूसना। लेकिन शायद जटिल सशर्त ऑपरेटर पठनीयता के लिए प्रारूपित करना मुश्किल है। – Joey

4

कोड की चार पंक्तियां, और सबसे अधिक पढ़ने योग्य, आईएमओ। एक त्रिगुट ऑपरेटर यहाँ की कोई जरूरत नहीं:

if (x == y || x == z) 
    z += y; 
else 
    z++;  

अगर मैं यह त्रिगुट का उपयोग कर लिखने के लिए किया था, मुझे क्या करना होगा:

z += (x == y || x == z) ? y : 1; 
+0

यह उनके संरेखण कोड के समान नहीं है। –

+0

@AshBurlaczenko: क्या अंतर है? – recursive

+0

@ एश Burlaczenko: हालांकि यह ठीक उसी तरह निष्पादित करता है। यह तय करने का कोई मतलब नहीं है कि 'x' या 'y' जोड़ना है या नहीं, यदि दोनों एक जैसे होने जा रहे हैं, और यदि वे नहीं हैं तो आप' y' * वैसे भी * जोड़ रहे हैं। – BoltClock

0

एक लाइन में z गणना करने के लिए, मैं कुछ इस तरह करना होगा :

public int GetZBasedOnXY(int z, int x, int y) 
{ 
    // Chose this solution, but any can go in here and work. 
    if (x == y || x == z) 
     return z + y; 
    else 
     return z + 1; 
} 
फिर

:

z = GetZBasedOnXY(z, x, y); 

अधिक पठनीय, और यदि नामकरण अच्छा है और विधि में इकाई परीक्षण कवरेज भी बेहतर है।

2

आप इस तरह कोष्ठकों का उपयोग करके ऐसा करना चाहिए: ":"

(x==y)?(z+=x):((x==z)?(z+=y):(z+=1)) 
0

इस त्रिगुट ऑपरेटर के साथ के बजाय किसी और अगर हालत है, तो बस जाने के बाद भी एक ही जारी रखने की आवश्यकता जारी रखने के लिए सरल है। नीचे नमूना है।

var result = a ? x : b ? y : z; 

Reference example

संबंधित मुद्दे