2010-03-15 13 views
12

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

एक अद्यतन एक्सटेंशन विधि काम करेगा? यदि ऐसा है तो मैं ऐसा करने के बारे में कैसे जाऊं?

EXAMPLE: 
(from trade in CrudeBalancedList 
where trade.Date.Month == monthIndex 
select trade).Update(
trade => trade.Buy += optionQty); 
+0

मैं इस प्रविष्टि को देखा और महसूस किया है इसका लिंक देखने वाले हर व्यक्ति के लिए उपयुक्त होगा मेरा सवाल ऊपर http://stackoverflow.com/questions/1344140/extension-method-for-update-in-linq-to-objects – Addie

उत्तर

29

हालांकि LINQ अपरिवर्तनीय डेटा की सूची को अद्यतन करने के लिए नहीं है, यह आइटम है कि आप अद्यतन करना चाहते प्राप्त करने के लिए बहुत आसान है। मुझे लगता है कि यह आपके लिए होगा:

(from trade in CrudeBalancedList 
    where trade.Date.Month == monthIndex 
    select trade).ToList().ForEach(trade => trade.Buy += optionQty); 
+1

यह एक नई अद्यतन सूची उत्पन्न करेगा या यह क्रूडबैलेंस्डलिस्ट अपडेट करेगा? –

+2

ToList() विधि कहने के बिंदु पर, मानदंडों को पूरा करने वाले व्यापार वस्तुओं की एक सूची है। इस सूची के लिए कोई चर नहीं है, इसलिए यह लाइन निष्पादित होने पर कचरा संग्रह के लिए एक लक्ष्य होगा। यदि आप इस सूची का उपयोग केवल [trade.Buy + = optionQty] करने से अधिक के लिए करना चाहते हैं, तो आप कोड की इस पंक्ति को कई अन्य लोगों को अलग करना चाहते हैं। सबसे पहले एक वैरिएबल को परिभाषित करें और सेट करें: सूची मासिक क्रूडबैलेंस्डलिस्ट = (व्यापार से आदि में। फिर अगली पंक्ति: मासिक क्रूडबल्डस्डलिस्ट। फॉरएच (ट्रेड => आदि। फिर, आपको नई सूची का संदर्भ होगा। –

1

तो आप यहां एक भी परिणाम प्राप्त करने की उम्मीद कर रहे हैं। उस मामले में आप SingleOrDefault विधि के उपयोग पर विचार हो सकता है:

var record = 
    (from trade in CrudeBalancedList 
    where trade.Date.Month == monthIndex 
    select trade).SingleOrDefault(); 

if (record != null) 
    record.Buy += optionQty; 

ध्यान दें कि SingleOrDefault विधि वहाँ उम्मीद ठीक एक या शून्य मान दिया (बहुत कुछ अद्वितीय प्राथमिक कुंजी के लिए एक तालिका में एक पंक्ति की तरह) किया जाना है। यदि एक से अधिक रिकॉर्ड लौटाए जाते हैं, तो विधि अपवाद फेंक देगी।

+0

या इसी तरह का उपयोग करें FirstOrDefault विधि।यदि एक से अधिक रिकॉर्ड लौटाए जाते हैं तो यह अपवाद नहीं फेंक देगा। – WEFX

0

ऐसी पद्धति बनाने के लिए आपको अपने प्रोटोटाइप के साथ शुरू होगा:

public static class UpdateEx { 
    public void Update(this IEnumerable<T> items, 
         Expression<Action> updateAction) { 
    } 
} 

आसान हिस्सा है यही कारण है कि।

हार्ड भाग Expression<Action> को एक SQL अद्यतन कथन में संकलित करेगा। इस पर निर्भर करता है कि आप कितना वाक्यविन्यास समर्थन करना चाहते हैं, इस तरह के एक कंपाइलर की जटिलता तुच्छ से असंभव तक हो सकती है।

लिंक अभिव्यक्तियों को संकलित करने के उदाहरण के लिए, TableQuerysqlite-net project की कक्षा देखें।

4

मुझे यकीन नहीं है कि यह सबसे अच्छा तरीका है, लेकिन आप सूची से तत्व को अपडेट करने की अनुमति देंगे।

परीक्षण वस्तु:

public class SomeClass { 
     public int Value { get; set; } 
     public DateTime Date { get; set; } 
    } 

विस्तार विधि:

public static class Extension { 
     public static void Update<T>(this T item, Action<T> updateAction) { 
      updateAction(item); 
     } 
    } 

परीक्षण:

public void Test() 
{ 
    // test data 
    List<SomeClass> list = new List<SomeClass>() 
    { 
     new SomeClass {Value = 1, Date = DateTime.Now.AddDays(-1)}, 
     new SomeClass {Value = 2, Date = DateTime.Now }, 
     new SomeClass {Value = 3, Date = DateTime.Now.AddDays(1)} 
    }; 
    // query and update 
    (from i in list where i.Date.Day.Equals(DateTime.Now.Day) select i).First().Update(v => v.Value += 5); 

    foreach (SomeClass s in list) { 
     Console.WriteLine(s.Value); 
    } 
} 
+0

या आप इसे इस तरह से कर सकते हैं: '(मैं सूची में जहां i.Date.Day.Equals (DateTime.Now.Day) का चयन करें I)। सबसे पहले()। मूल्य + = 4; ' – HellBaby