2012-07-31 27 views
8

मैं इस परिदृश्य पर जहां मैं एक सूची के लिए कुछ आइटम जोड़ना चाहते हैं ...सूची। IENumerable <T> पैरामीटर काम नहीं कर रहा है?

List<T> items = new List<T>(); 
IEnumerable<T> addItems = someCollection.Where(...); 
items.AddRange(addItems); 

इस कोड का उपयोग करना, कोई आइटम सूची में जोड़ा लेकिन कर रहे हैं अगर मैं एक .ToList() तो बाद Linq जोड़ने कथन तो वस्तुओं को सही ढंग से जोड़ा जाता है। मुझे लगता है कि यह स्थगित निष्पादन के कारण है, लेकिन मैंने सोचा होगा कि List.AddRange फ़ंक्शन एक आईनेमरेबल स्वीकार करता है कि यह आइटम को जोड़े जाने के लिए गणना करेगा।

कोई स्पष्ट कृपया ऐसा क्यों होता कर सकते हैं?

+0

यह सी # है, है ना? – Antimony

+0

क्षमा करें, हाँ सी # (4.0) – John

+1

आप कैसे देख रहे हैं "कोई आइटम नहीं जोड़ रहे हैं" क्योंकि यह आइटम जोड़ना चाहिए? –

उत्तर

2

उत्तर के लिए धन्यवाद। मैंने इस उदाहरण के लिए कोड को सरल बनाने की कोशिश की लेकिन सामान्य रूप से, शैतान विवरण में है!

बीच .Where() बयान और AddRange() फोन कोड था (गहरे) स्रोत सूची (इस उदाहरण में 'आइटम') साफ हो गया। डेवलपर को यह एहसास नहीं हुआ कि फ़िल्टर को तब तक स्थगित कर दिया गया था जब तक AddRange() कॉल उस बिंदु पर उन्होंने स्रोत सूची को पहले से ही मंजूरी दे दी थी।

जानकर खुशी हुई कि मैंने साजिश खो दी है :)

4

मुझे लगता है कि इस आस्थगित निष्पादन की वजह से है, लेकिन मैं सोचा होगा दिया List.AddRange समारोह एक IEnumerable स्वीकार करता है कि है कि यह आइटम जोड़े जाने की गणना होगी।

यह करता है। वहाँ ICollection<T> के लिए एक शॉर्ट सर्किट (जो आप इस मामले में मारा नहीं होता) है, जो यह बजाय आइटम की गणना की ICollection<T>.CopyTo उपयोग करने के लिए, लेकिन अन्यथा, यह संग्रह करके बताना होगा कारण होगा है।

एक काम उदाहरण के लिए, कोशिश:

using System; 
using System.Linq; 
using System.Collections.Generic; 

internal class Program 
{ 
    private static List<T> RunQuery<T>(IEnumerable<T> someCollection, Func<T, bool> predicate) 
    { 
     List<T> items = new List<T>(); 
     IEnumerable<T> addItems = someCollection.Where(predicate); 
     items.AddRange(addItems); 
     return items; 
    } 

    static void Main() 
    { 
     var values = Enumerable.Range(0, 1000); 

     List<int> results = RunQuery(values, i => i >= 500); 

     Console.WriteLine(results.Count); 
     Console.WriteLine("Press key to exit:"); 
     Console.ReadKey(); 
    } 
} 

यह अपने सटीक कोड का उपयोग करता है, और (List<T> में वस्तुओं का उचित संख्या) 500 बाहर प्रिंट होगा।

+0

शायद ओपी के उदाहरण में 'कुछ चयन' कुछ प्रकार का है जिसने 'खाली टीओ' को खाली परिभाषा के साथ कार्यान्वित किया है? –

+0

@ दांताओ हां - यह संभव है कि कुछ और हो रहा है।लेकिन, सामान्य रूप से, यह 'IEnumerable ' के साथ ठीक से काम करता है - यह "स्थगित निष्पादन" समस्या नहीं है। –

+0

@ दैनटाओ (ध्यान दें कि ओपी को अपनी "कहां" विधि की आवश्यकता होगी जो अजीब कार्यान्वयन के साथ 'आईसीओलेक्शन ' बनाता है) –

1

यह काम करता है। यहां एक यूनिट परीक्षण है जो इसे साबित करता है:

[TestFixture] 
public class AddRangeTest 
{ 
    [Test] 
    public void AddRange() 
    { 
     var list = new List<int>(); 
     var someCollection = new List<int> { 1, 2, 3 }; 
     var subItems = someCollection.Where(x => x > 1); 
     list.AddRange(subItems); 
     Assert.AreEqual(2, list.Count); 
    } 
} 

शायद आपके विशिष्ट परिदृश्य में कुछ ऐसा है जो सही तरीके से काम नहीं कर रहा है।

2

मैंने सोचा होगा कि सूची दी गई है। AddRange फ़ंक्शन स्वीकार करता है कि यह आइटम को जोड़ने के लिए गणना करेगा।

मैं नीचे और AddRange(IEnumerable<T>) की कोशिश की काम करता है

List<string> someCollection = new List<string>{"A", "B", "C"}; 
List<string> items = new List<string>(); 
IEnumerable<string> addItems = someCollection.Where(x => x != ""); 
items.AddRange(addItems); 

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

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