2009-06-13 21 views
9

का उपयोग करके किसी सूची में कैसे जोड़ें I मेरे पास एक प्रकार की ऑब्जेक्ट्स का संग्रह है जिसे मैं एक अलग प्रकार में परिवर्तित करना चाहता हूं। इसे फोरैच के साथ आसानी से किया जा सकता है, लेकिन मैं यह समझना चाहता हूं कि इसे करने के लिए लिंक के कुल फ़ंक्शन का उपयोग कैसे करें।लिंक के कुल फ़ंक्शन C#

समस्या सभी उदाहरण उदाहरण प्रकार लाइन स्ट्रिंग या int का उपयोग करते हैं, जो '+' ऑपरेटर का समर्थन करते हैं। मैं संचयक प्रकार एक सूची होना चाहता हूं, जो '+' अर्थशास्त्र का समर्थन नहीं करता है।

public class DestinationType 
{ 
    public DestinationType(int A, int B, int C) { ... } 
} 

var set = from item in context.Items 
      select new { item.A, item.B, item.C }; 

var newSet = set.Aggregate(new List<DestinationType>(), 
          (list, item) => list.Add(new DestinationType(item.A, item.B, item.C))); 

समस्या यह है कि सूची < है> .Add शून्य रिटर्न:

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

अगर मैं एक सूची प्रकार, जो समर्थित '+' प्रकार अर्थ विज्ञान था मैं सिर्फ दूसरा पैरामीटर

list + item 

हालांकि मैं किसी भी संग्रह प्रकार बात इस तरह का समर्थन करता है कि नहीं मिल रहा है बना सकते हैं।

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

+0

सभी महान जवाब के लिए धन्यवाद! सैम एंड टल्जोज के उत्तरों ने लिंकक का उपयोग करके इसे सबसे अधिक पूरा किया। फिर से Thx! – Slaggg

उत्तर

9

मुझे लगता है कि Select पर कॉल ToList() के साथ संयुक्त हो सकता है जो आपको यहां चाहिए। उदाहरण के लिए:

context.Items 
    .Select(item => new DestinationType(item.A, item.B, item.C)) 
    .ToList(); 
23

यह मानते हुए वस्तुओं के लिए LINQ है, कोशिश ...

var newSet = set.Aggregate(new List<DestinationType>(), 
            (list, item) => 
            { 
             list.Add(new DestinationType(item.A, item.B, item.C)); 
             return list; 
            }); 
+0

यह करने का यह सही तरीका है। – mquander

+0

यह फंक भाग में यूनियन का उपयोग करते समय भी मेरे लिए काम करता है –

4

तुम बस select यहां आवेदन कर सकते हैं।

var newSet = set.Select(item => new DestinationType(...)).ToList(); 

Aggregate (आम तौर पर fold या reduce के रूप में जाना जाता है) तत्वों को एक साथ जहां select प्रत्येक तत्व के लिए एक समारोह लागू होता है गठबंधन किया जाता है।

पूर्व:

Let एक एकल समारोह, तो [a, b, c].select(f) के बराबर होती है [f(a), f(b), f(c)] हो f

Let एक द्विआधारी समारोह, तो [a, b, c].aggregate(f, init) के बराबर होती है f(a, f(b, f(c, init))) हो f

reversed = fold (\list element -> element:list) [] [1..10] 

तुम सच में करना चाहते हैं:

तरह से आप अपने उदाहरण में चुना सी # में असामान्य है, लेकिन अक्सर कार्यात्मक प्रोग्रामिंग जहां (जुड़े) सूचियों नई सूचियों में के बजाय तब्दील कर रहे हैं एक मौजूदा संग्रह को बदलने में प्रयोग किया जाता है aggregate के साथ यह गणना करें, डस्टिन के समाधान का उपयोग करें या अपरिवर्तनीय संग्रह के लिए एक लिंक-सूची-आधारित प्रकार को बेहतर ढंग से कार्यान्वित करें (आप इस प्रकार को operator + भी दे सकते हैं)।

3
list.AddRange(context.Items.Select(item => 
    new DestinationType(item.A, item.B, item.C)); 

मुझे एहसास है कि यह कुल फ़ंक्शन का उपयोग नहीं करता है, लेकिन आपको कुल सीखने के लिए उपयोग करने के लिए शायद एक बेहतर उदाहरण मिलना चाहिए।

1

जब तक मैं कुछ स्पष्ट याद कर रहा हूँ, क्यों नहीं बस करो:

public class DestinationType 
{ 
    public DestinationType(int A, int B, int C) { ... } 
} 

var newSet = from item in context.Items 
    select new DestinationType(item.A, item.B, item.C); 
संबंधित मुद्दे