2012-10-17 30 views
8

क्या fooCollection को दो बार गणना किए बिना linq के साथ ऐसा करने का कोई तरीका है?लिंक एक ही पुनरावृत्ति के भीतर चयन करें और कुल

var fooCollection = // get foo 
var selectedIds = new List<int>(); 
var aggregateContent = String.Empty; 

foreach (var f in foo) 
{ 
    selectedIds.Add(foo.Id); 
    aggregateContent += foo.Content 
} 

var results = new FooResults 
{ 
    Content = aggregateContent, 
    SelectedIds = selectedIds 
}; 

return results; 

उत्तर

10

हाँ, आप Enumerable.Aggregate विधि का उपयोग कर सकते हैं। मैं अपने LINQ में दुष्प्रभावों को नापसंद करता हूं। =)

+0

मुझे लगता है कि आपने इसे जेन्स पर खींचा है। धन्यवाद। – Nick

+0

+1: 'कुल' विधि का अच्छा उपयोग। टीआईएल। –

1

आप ऐसा कर सकता है:

foo.ForEach(x => { selectedIds.Add(x.Id); aggregateContent += x.Content; }); 

मैं एक स्ट्रिंग में सामग्री श्रृंखलाबद्ध नहीं की सिफारिश करेंगे, लेकिन बजाय एक StringBuilder उपयोग करने के लिए।

संपादित

आप एक LINQ विस्तार पुस्तकालय है कि IEnumerable के लिए ForEach लागू करता है की जरूरत नहीं है, तो यहां एक विधि है आप का उपयोग कर सकते हैं:

public static void ForEach<T>(this IEnumerable<T> enumeration, Action<T> action) 
{ 
    foreach(T item in enumeration) 
    { 
     action(item); 
    } 
} 
+1

कृपया ध्यान दें: 'EEumer' 'IENumerable ' के लिए मौजूद नहीं है। यह 'सूची ' की सदस्य विधि है। –

+0

धन्यवाद डैनियल; मैंने तदनुसार अपना जवाब बढ़ाया। –

+1

मैं दूसरा @ डैनियल की टिप्पणी: List.Foreach के पास linq के साथ कुछ लेना देना नहीं है। (सवाल LINQ समाधान के लिए पूछता है)। –

2

एक possiblity है, लेकिन मैं विचार यह एक हैक:

var aggregateContent = String.Empty; 
var selectedIds = foo.Select(x => { aggregateContent += x.Content; 
            return x.Id; }) 
        .ToList(); 

मैं पाश आपके पास पहले से साथ जाना होगा। यह बहुत साफ है क्योंकि आप जिस LINQ समाधान के साथ आ सकते हैं।

var result = fooCollection.Aggregate(new FooResult(), 
            (r,f) => 
            { 
             r.SelectedIds.Add(f.Id); 
             r.Content += f.Content; 
             return r; 
            }); 

इस पक्ष प्रभाव मुक्त होने का लाभ है:

+1

मैं देखता हूं कि आपका क्या मतलब है - दोनों का चयन करने के लिए लिंक का उपयोग करना और कुछ बढ़ाना बिल्कुल सीक्यूआरएस नहीं है। हालांकि मैं कुल समारोह के साथ काम करने जा रहा हूं लिंकक प्रदान करता है क्योंकि यह स्पष्ट करता है कि मैं स्पष्ट रूप से क्या करने की कोशिश कर रहा हूं और कम हैकी महसूस करता हूं। धन्यवाद। – Nick

0

आप जो पूछ रहे हैं वह है कि एक लिंक कथन दो परिणाम उत्पन्न करे। linq का पूरा विचार साइड इफेक्ट्स के बिना एक संक्षिप्त कार्यात्मक प्रोग्रामिंग शैली की अनुमति देना है।

यदि आप कई परिणाम और अच्छे प्रदर्शन चाहते हैं, तो आपको लिंक का उपयोग नहीं करना चाहिए, और नियमित foreach का उपयोग नहीं करना चाहिए।

+0

मैं मानता हूं कि मैं सीक्यूआरएस के साथ इनलाइन नहीं रख रहा हूं, लेकिन कुल फ़ंक्शन का उपयोग करके मैं एक फ़ंक्शन व्यक्त कर रहा हूं जो * केवल * दुष्प्रभाव पैदा कर रहा है - जिसके परिणाम स्पष्ट हैं। – Nick

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

  • कोई संबंधित समस्या नहीं^_^