2011-10-20 40 views
10

क्या LINQ के साथ इन असाइनमेंट करने का कोई बेहतर तरीका है?क्या LINQ में मान सेट करने का कोई तरीका है?

IEnumerable<SideBarUnit> sulist1 = newlist.Where(c => c.StatusID == EmergencyCV.ID); 
foreach (SideBarUnit su in sulist1) su.color = "Red"; 
+1

(http://stackoverflow.com/questions/200574/linq-equivalent-of-foreach-for-ienumerablet) –

उत्तर

8

सं

के रूप में अन्य जवाब यहां का कहना है आप ऐसा कर सकते हैं, लेकिन फिर तुम अब कर रहे हैं LINQ का उपयोग कर।

एरिक लिपर्ट ने an excellent blog post about this very subject लिखा, जिसे मैं आपको अत्यधिक अनुशंसा करता हूं।यहाँ एक अंश है:

मैं दार्शनिक दो कारणों के लिए इस तरह के एक विधि है, प्रदान करने के लिए विरोध कर रहा हूँ।

पहला कारण यह है कि ऐसा करने से कार्यात्मक प्रोग्रामिंग सिद्धांतों का उल्लंघन होता है कि अन्य सभी अनुक्रम ऑपरेटर इस पर आधारित होते हैं। स्पष्ट रूप से इस विधि के लिए कॉल का एकमात्र उद्देश्य साइड इफेक्ट्स का कारण बनना है।

अभिव्यक्ति का उद्देश्य एक मूल्य की गणना करना है, न कि दुष्प्रभाव का कारण बनना।

...

दूसरा कारण यह है कि ऐसा करने से भाषा को शून्य नई प्रतिनिधित्ववादी शक्ति कहते है। इस कोड में

foreach(Foo foo in foos){ statement involving foo; } 

:: ऐसा करने तो आप इस पूरी तरह से स्पष्ट कोड को फिर से लिखने की सुविधा देता है

foos.ForEach((Foo foo)=>{ statement involving foo; }); 

जो थोड़ा अलग क्रम में लगभग ठीक उसी वर्णों का उपयोग करता। और फिर भी दूसरा संस्करण समझना कठिन है, डीबग करना कठिन है, और बंद करने वाले अर्थशास्त्र प्रस्तुत करता है, जिससे संभावित रूप से सूक्ष्म तरीकों से ऑब्जेक्ट जीवनकाल बदल जाता है।

+2

+1 अन्य लोगों ने इसका उल्लेख किया है, और अन्य आगे बढ़ गए हैं और ForEach() के उदाहरण दिखाए हैं। मैं एरिक लिपर्ट के साथ यहां और अधिक सहमत नहीं हो सका। शायद इस अंश को स्पष्ट रूप से पोस्ट करने से ओपी को विश्वास मिलेगा, या शायद नहीं। फिर भी, सबसे अच्छा जवाब आईएमओ। – Didaxis

4

सबसे आसान तरीका है एक foreach विस्तार विधि आप इस तरह की एक प्रश्न के अंत पर इसे जोड़ने के लिए अनुमति देता है जो परिभाषित करने के लिए है। उदाहरण के लिए

public static void ForEach<T>(this IEnumerable<T> enumerable, Action<T> action) { 
    foreach (var cur in enumerable) { 
    action(cur); 
    } 
} 

... 

उपयोग:

IEnumerable<SideBarUnit> sulist1 = 
    newlist.Where(c => c.StatusID == EmergencyCV.ID) 
      .ToList() 
      .ForEach(item => item.color = "Red"); 

पुनश्च::

newlist 
    .Where(c => c.StatusID == EmergencyCV.ID) 
    .ForEach(cur => cur.color = "Red"); 
4

List.ForEach() पद्धति का उपयोग के बारे में मैं एरिक Lippert के article aboout ForEach() vs foreach पता है, लेकिन वैसे भी यह उपयोगी है और मैं इसे नहीं बल्कि preffer for/foreach लूप

संपादित करें: प्रदर्शन के बारे में टिप्पणी में सवाल के बारे में हिट

Enumerable.ToList() तो प्रदर्शन हिट एक बार एक नई List<>() उदाहरण बनाने के लिए है

public static List<TSource> ToList<TSource>(this IEnumerable<TSource> source) 
{ 
    if (source == null) 
    { 
     throw Error.ArgumentNull("source"); 
    } 
    return new List<TSource>(source); 
} 

रूप में लागू किया।

MSDN List<>(IEnumerable<>) ctor के लिए संदेश है:

सूची वर्ग है कि तत्वों निर्दिष्ट संग्रह से की नकल की है और की नकल की तत्वों की संख्या को समायोजित करने के लिये पर्याप्त क्षमता है का एक नया उदाहरण आरंभीकृत।

तो वहाँ सभी सूची

+1

दूसरे शब्दों में, संग्रह है [के लिए IEnumerable foreach के LINQ बराबर] के संभावित डुप्लिकेट दोहराया – Magnus

+1

'फॉरएच' एक लिंक-अनन्य "फीचर" नहीं है, हालांकि। वास्तव में, यह लिंक से पूरी तरह से असंबंधित है। तो, मैं आपका जवाब मानता हूं, वास्तव में, "नहीं, लेकिन यहां एक विकल्प है।" _ [क्यों] के लिए सलाह (http://stackoverflow.com/questions/7838458/is-there-a-way-to-set-values-in-linq/7838525#7838525) _ इनपुट का एक बड़ा टुकड़ा होगा इस जवाब के लिए - ओपी के बजाय एक झूठी छाप के साथ आ रहा है कि यह लिंक है। –

+0

@ एमआर। निराशा: बिल्कुल, LINQ 'toLisT()' कॉल – sll

4

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

newlist.Where(c => c.StatusID == EmergencyCV.ID). 
    ToList(). 
    ForEach(su => su.color = "Red"); 

मुझे यकीन है कि पठनीयता हालांकि बेहतर है नहीं कर रहा हूँ ...

+0

@vs 74 के बाद समाप्त होता है 74 क्या आईनम <> से एक सूची <> में कनवर्ट करते समय कोई प्रदर्शन हिट होता है? – 0x4f3759df

+2

@iterationx, अच्छी तरह से एक नई सूची बनाई जा रही है, इसलिए यह पुनरावर्तनीय के रूप में उतना कुशल नहीं है + मुझे लगता है कि यह कम पठनीय है इसलिए मुझे यकीन नहीं है कि यह तकनीक का उपयोग करने योग्य है ... –

2

LINQs उद्देश्य मुख्य रूप से क्वेरी करने के लिए/परियोजना/डेटा को बदलने है।

आप ForEach एक्सटेंशन विधि का उपयोग करना चाह सकते हैं। लेकिन अधिक जानकारी के लिए this discussion देखें।

1

आप एक बयान चयन में एक गुमनाम विधि इस्तेमाल कर सकते हैं:

var sulist1 = newlist.Where(c => c.StatusID == EmergencyCV.ID) 
        .Select(c => { 
            c.color = "Red"; 
            return c; 
            }); 
+0

असल में मुझे विश्वास नहीं है कि यह काम करेगा जब तक कि नई सूची को पुनरावृत्त नहीं किया जाता – Davy8

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

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