2013-07-18 6 views
6

मेरे पास एक ऐसा ऑब्जेक्ट है जो व्यावसायिक डेटा का प्रतिनिधित्व करता है।वस्तुओं पर लिंक एसयूएम?

public class MyClass{ 
    public double MyDataOne {get;set;} 
    public double MyDataTwo {get;set;} 
    public double MyDataThree {get;set;} 

    public static MyClass operator +(MyClass data1, MyClass data2){ 
     return new MyClass{MyDataOne = data1.MyDataOne + data2.MyDataOne, MyDataTwo=data1.MyDataTwo+data2.MyDataTwo, MyDataThree=data1.MyDataThree+data2.MyDataThree }; 
    } 
} 

अब, :? अगर मैं एक IEnumerable<MyClass> myClasses कर दिया है, somethings मैं MyClass में लागू कर सकते हैं इस बनाने के लिए है:

असल में, यह एक वस्तु कुछ योग agregating है

myClasses.Sum(d=>d); 

क्योंकि मेरे लिए, जिस तरह से एक वस्तु additioned है वस्तु के ज्ञान और नहीं फोन करने वाले होने चाहिए (अगर एक दिन मैं गया है एक डेटा अधिक, मैं नहीं चाहता कि मेरे पूरे कोड में देखना चाहते हैं यह देखने के लिए कि इसका उपयोग कहाँ किया जाता है)।

धन्यवाद

+0

http://stackoverflow.com/a/13661394/1714342 यह कुछ – wudzik

उत्तर

4

लिखें अपनी खुद की विस्तार विधि:

public static MyClass Sum(this IEnumerable<MyClass> source) 
{ 
    var result = new MyClass(); // all data will be zeros 

    foreach(var item in source) 
     result = result + item; 

    return result; 
} 

उपयोग:

var sum = myClasses.Sum(); 
+1

बताते हैं और तुम भी कुछ ISumable' बुलाया 'इंटरफेस शुरू करने से यह अधिक सामान्य बनाने के लिए और सभी' IEnumerable के लिए सामान्य विस्तार कर सकते हैं, तो जहां टी: ISumable ':) – wudzik

+1

@ वुदज़िक 'याग्नी' :) इस व्यवहार के साथ उसके पास केवल एक व्यवसाय वर्ग है –

+0

@wudzik धन्यवाद। मैं बस यह जोड़ूंगा कि मैं एक इंटरफ़ेस बनाउंगा, यह सुनिश्चित करने के लिए कि जिस वर्ग पर मैं एक 'Sum' विधि लागू करता हूं जो पैरामीटर में एक आईनेमरेबल सूची लेता है। इस तरह मैं कई मध्यवर्ती तत्व नहीं बनाता हूं – J4N

5

आप IEnumerable<T>.Aggregate करने के लिए अपने स्वयं के एक्सटेंशन विधि है कि एक कॉल लपेटता लिख ​​सकते हैं जो बदले में कॉल अपने अधिभारित operator +:

public static MyClass Sum(this IEnumerable<MyClass> collection) 
{ 
    return collection.Aggregate((a, b) => a + b); 
} 

इस से बुलाया जाएगा:

MyClass sum = myClasses.Sum(); 

या यहां तक ​​कि एक कदम आगे जाना है, सामान्य, और एक चयनकर्ता में शामिल हैं:

public static MyClass Sum<T>(this IEnumerable<T> collection, 
    Func<T, MyClass> selector) 
{ 
    return collection.Aggregate(new MyClass() /*start with an empty MyClass*/, 
     (a, b) => a + selector(b)); 
} 

सुझाव के रूप में यह कहा जा सकता है:

MyClass sum = myClasses.Sum(d => d); 

साथ ही जटिल प्रकारों सेउदाहरण के लिए:

class Foo 
{ 
    public MyClass Bar {get; set;} 
    public int Baz {get; set;} 
} 

var FooList = new List<Foo>(); 

MyClass sumOfFooListsBars = FooList.Sum(f => f.Bar); 
0

आदेश Sum उपयोग करने के लिए आप Func<MyClass, ###> प्रतिनिधि, जहां ###int, long, float, double, decimal या उनके नल समकक्षों है प्रदान करना चाहिए में। तो आप जिस तरह से चाहते हैंका उपयोग करने में सक्षम नहीं हैं।

Sum विधि के सभी ओवरलोड ऊपर वर्णित आदिम प्रकार लौटाते हैं। यही कारण है कि रिटर्न प्रकार के दौरान यह कस्टम ऑब्जेक्ट को समझ में नहीं आता है, लेकिन एक कस्टम ऑब्जेक्ट भी नहीं है।

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