2013-03-14 3 views
5

के लिनक योग कैसे प्राप्त करें I वस्तुओं की एक संख्यात्मक संग्रह में संख्याओं की संख्या कैसे प्राप्त करें? मुझे यकीन है कि अंतर्निहित प्रकार हमेशा संख्यात्मक होगा लेकिन प्रकार रनटाइम पर निर्धारित होता है।आईएनयूमेरेबल <object>

IEnumerable<object> listValues = data.Select(i => Convert.ChangeType(property.GetValue(i, null), columnType)); 

उसके बाद मैं निम्न करने के लिए सक्षम होना चाहते हैं (निम्न त्रुटि है: "विधि योग को हल नहीं कर सकते"):

var total = listValues.Sum(); 

कोई भी विचार? धन्यवाद।

+1

सही प्रकार रनटाइम पर क्यों निर्धारित किया जाता है? यह बहुत फिश लगता है! – sdfgsdfg

+0

यदि प्रकार रनटाइम पर निर्धारित होता है, जो जेनेरिक के लिए नौकरी की तरह लगता है। क्या आपके पास 'IENumerable सूची वैल्यू' के निर्माण की पहुंच है? क्या आप इसे 'आईनेमेरेबल ' में बदल सकते हैं जहां टी: स्ट्रक्चर, आईकोनवर्टिबल '? – Tory

+0

@Tory - हाँ मेरे पास IENumerable के निर्माण तक पहुंच है, लेकिन मुझे नहीं पता कि आप जिस बदलाव को सुझाव दे रहे हैं उसे बिल्कुल कैसे बनाया जाए। मैं जेनेरिक दुनिया के लिए नया हूं, कृपया एक उदाहरण प्रदान करें, धन्यवाद। – Mike

उत्तर

4

आप अभिव्यक्ति के पेड़ का उपयोग आवश्यक ऐड समारोह उत्पन्न करने के लिए है, तो अपने इनपुट सूची पर गुना कर सकते हैं:

private static Func<object, object, object> GenAddFunc(Type elementType) 
{ 
    var param1Expr = Expression.Parameter(typeof(object)); 
    var param2Expr = Expression.Parameter(typeof(object)); 
    var addExpr = Expression.Add(Expression.Convert(param1Expr, elementType), Expression.Convert(param2Expr, elementType)); 
    return Expression.Lambda<Func<object, object, object>>(Expression.Convert(addExpr, typeof(object)), param1Expr, param2Expr).Compile(); 
} 

IEnumerable<object> listValues; 
Type elementType = listValues.First().GetType(); 
var addFunc = GenAddFunc(elementType); 

object sum = listValues.Aggregate(addFunc); 

टिप्पणी इस खाली नहीं होना करने के लिए इनपुट सूची की आवश्यकता है, लेकिन यह लाभ दिया है परिणाम में तत्व प्रकार को संरक्षित करने के लिए।

+0

आपका समाधान पूरी तरह से ठीक काम करता है! बस पूरी अवधारणा को समझने की कोशिश कर रहा है। धन्यवाद। – Mike

10

तुम्हें पता है, ठीक वैसी ही हमेशा एक अंकीय प्रकार होने जा रहा है, तो आप की तरह कुछ का उपयोग करने के लिए सक्षम होना चाहिए: क्योंकि Convert.ToDoubleIConvertible, जिसके द्वारा कार्यान्वित किया जाता है के लिए दिखेगा

double total = listValues.Sum(v => Convert.ToDouble(v)); 

यह काम करेंगे कोर संख्यात्मक प्रकार। आप इस प्रकार को double होने के लिए मजबूर कर रहे हैं, न कि मूल प्रकार भी।

+0

ध्यान रखें कि यह एक 'अमान्यकास्ट अपवाद' फेंक सकता है उदा। तार और अन्य वस्तुओं! –

+0

@ebeeb - यह सच है, उस कॉल से पहले कोड यह सुनिश्चित करता है कि उस बिंदु पर केवल संख्यात्मक प्रकार हो रहे हैं। – Mike

+0

रीड - आपका समाधान सरल है और ठीक काम करता है, लेकिन मैं मूल प्रकार को संरक्षित करना चाहता हूं। – Mike

-1
static void Main(string[] args) 
{ 
    var sum = GetData().TryCast<double>.Sum(); 
} 

private static IEnumerable<object> GetData() 
{ 
    yield return 4.478; 
    yield return 4f; 
    yield return 0xFF; 
    yield return false; 
    yield return new List<string> { "foo", "bar" }; 
} 

// the extension function 
public static IEnumerable<T> TryCast<T>(this IEnumerable<object> values) 
{ 
    foreach (var v in values) 
    { 
     T a = default(T); 
     try 
     { 
      a = (T) Convert.ChangeType(v, typeof (T)); 
     } 
     catch (FormatException) 
     { 
     } 
     yield return a; 
    } 
} 

मैं यह काफी बदबूदार, अपने डीबी रिटर्न मूल्यों की गैर-निर्धारित प्रकार है कि लगता है। यह LINQ एक्सटेंशन विधि कुछ (!) टाइप-सुरक्षा प्रदान करती है और Convert.ToDouble() के रूप में अपवाद नहीं फेंकती है, भले ही आप बूलियन और ऑब्जेक्ट्स लौटें।

+1

यह सवाल का जवाब नहीं देता है। सवाल यह है कि यदि आपके पास IENumerable का संग्रह है, तो आप इसे कैसे समेटते हैं? –

+0

मुझे खेद है, मैं इसे फिर से संपादित कर रहा हूं। हालांकि आपकी समस्या LINQ थी। –

+0

मैंने तदनुसार अपना जवाब अपडेट किया। :) –

0

एक प्रकार में परिवर्तित करें। कहो, दशमलव।

data.Select(i => Convert.ToDecimal(property.GetValue(i, null)).Sum();

0

आप Dyanmic उपयोग कर सकते हैं, सही काम करता है:

listValues.Sum(x => (dynamic)x); 
+0

मेरे परिदृश्य में यह समाधान केवल तभी काम करता है जब अंतर्निहित प्रकार int है। – Mike

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