2008-10-05 4 views
6

मैंने जेनिक्स का अधिक उपयोग नहीं किया है और इसलिए यह पता नहीं लगाया जा सकता है कि डुप्लिकेशंस को कम करने के लिए जेनरिक का उपयोग करके निम्नलिखित तीन तरीकों को एक में बदलना संभव है। दरअसल मेरे कोड में वर्तमान में छह विधियां हैं लेकिन यदि आप इसे तीनों के लिए हल कर सकते हैं तो शेष को वही समाधान के साथ वैसे भी काम करना चाहिए।सी # जेनेरिक का उपयोग करके इन 3 तरीकों को एक में कैसे चालू करें?

private object EvaluateUInt64(UInt64 x, UInt64 y) 
    { 
     switch (Operation) 
     { 
      case BinaryOp.Add: 
       return x + y; 
      case BinaryOp.Subtract: 
       return x - y; 
      case BinaryOp.Multiply: 
       return x * y; 
      case BinaryOp.Divide: 
       return x/y; 
      case BinaryOp.Remainder: 
       return x % y; 
      default: 
       throw new ApplicationException("error"); 
     } 
    } 

    private object EvaluateFloat(float x, float y) 
    { 
     switch(Operation) 
     { 
      case BinaryOp.Add: 
       return x + y; 
      case BinaryOp.Subtract: 
       return x - y; 
      case BinaryOp.Multiply: 
       return x * y; 
      case BinaryOp.Divide: 
       return x/y; 
      case BinaryOp.Remainder: 
       return x % y; 
      default: 
       throw new ApplicationException("error"); 
     } 
    } 

    private object EvaluateDouble(double x, double y) 
    { 
     switch (Operation) 
     { 
      case BinaryOp.Add: 
       return x + y; 
      case BinaryOp.Subtract: 
       return x - y; 
      case BinaryOp.Multiply: 
       return x * y; 
      case BinaryOp.Divide: 
       return x/y; 
      case BinaryOp.Remainder: 
       return x % y; 
      default: 
       throw new ApplicationException("error"); 
     } 
    } 

मैं एक सरल अभिव्यक्ति पार्सर है कि तब इस तरह के अलावा/घटाव आदि मैं ऊपर तरीकों का उपयोग वास्तविक गणित प्रासंगिक प्रकार का उपयोग किया पाने के लिए के रूप में सरल द्विआधारी संचालन का मूल्यांकन करने की जरूरत है निर्माण कर रहा हूँ। लेकिन एक बेहतर जवाब होना चाहिए!

उत्तर

9

जेनिक्स मूल रूप से अंकगणित का समर्थन नहीं करता है। हालांकि, यह .NET 3.5, like so के साथ किया जा सकता है। ऑपरेटर वर्ग MiscUtil का हिस्सा है। यह तो हो जाता है:

public T Evaluate<T>(T x, T y) { 
     switch (Operation) 
     { 
     case BinaryOp.Add: 
      return Operator.Add(x, y); 
     case BinaryOp.Subtract: 
      return Operator.Subtract(x, y); 
    ... etc 

जब से तुम एक अभिव्यक्ति पार्सर लिख रहे हैं, यह एक अच्छा विचार सीधे अभिव्यक्ति का उपयोग करने से हो सकता है, लेकिन आप इसके बाद के संस्करण का उपयोग करने के लिए स्वागत है।

+0

लोकप्रिय अटकलों के विपरीत, मार्क और मैं वास्तव में दो अलग-अलग लोग हैं। हम कभी-कभी दिमाग साझा करते हैं। –

+0

शायद हम सिर्फ * सोचें * कि ... कभी भी फाइट क्लब देखें? –

+0

एक्सचेंज करने योग्य मस्तिष्क? ठंडा। – EricSchaefer

4

मार्क ग्रेवेल ने जेनेरिक गणित को व्यवहार्य बनाने पर बहुत सारे काम किए हैं। MiscUtil और general article about the issue देखें।

MiscUtil के वर्तमान संस्करण में कोड अभिव्यक्ति पेड़ों के उपयोग के कारण .NET 3.5 की आवश्यकता है। हालांकि, मेरा मानना ​​है कि मार्क का एक संस्करण है जो .NET 2.0 के साथ भी काम करता है। यदि यह लोगों के लिए उपयोगी होगा, तो मुझे यकीन है कि हम इसे किसी भी तरह से शामिल कर सकते हैं (संभवतः MiscUtil में एक मुखौटा के साथ जो रनटाइम पर फ्रेमवर्क संस्करण के आधार पर उपयुक्त कार्यान्वयन का उपयोग करेगा)।

भविष्य के लिए, मैं static interfaces देखना चाहता हूं जो जेनेरिक गणित प्रकारों के साथ काम करने का एक वैकल्पिक तरीका प्रदान कर सकता है।

+0

मुझे शायद 2.0 को फिर से करने की आवश्यकता होगी - मुझे लगता है कि यह एक एचडीडी पर मर गया; मैंने आपको एक प्रतिलिपि ईमेल की - आपको नहीं लगता अभी भी यह है? यह काम की एक बड़ी मात्रा नहीं है, हालांकि ... –

+0

मुझे शायद यह संभवतः है। अब जांच नहीं सकते हैं, लेकिन अगर आप मुझे याद दिलाते हैं तो बाद में देखेंगे। –

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

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