का एकाधिक गणना मुझे पता है कि आईन्यूमेरेबल पर कई बार चर्चा की गई है लेकिन मुझे अपने विशिष्ट प्रश्न का उत्तर नहीं मिला, इसलिए मैं इसे एक नए प्रश्न के रूप में ला रहा हूं।आईन्यूमेरेबल
कोड का निम्न भाग पर विचार करें:
static void Main(string[] args)
{
List<string> testList = new List<string> {"Test", "Test1", "Test1"};
IEnumerable<string> filtered = testList.Where(x => x == "Test1");
DoSomeWork(filtered);
DoSomeMoreWork(filtered);
}
public static void DoSomeWork(IEnumerable<string> items)
{
foreach (var item in items)
{
Console.WriteLine("do some work");
}
}
public static void DoSomeMoreWork(IEnumerable<string> items)
{
foreach (var item in items)
{
Console.WriteLine("do some more work");
}
}
मैं सही हूँ, कि यह न केवल दो दो बार पुनरावृति करने के लिए "फ़िल्टर किए गए" आइटम, लेकिन वास्तव में आइटम का कारण बनता है "testList" में? इसलिए, इस बात पर विचार करते हुए कि "टेस्टलिस्ट" 10000 वस्तुओं के साथ एक बड़ी सूची थी और "फ़िल्टर" इसे 10 आइटम तक कम कर देता है, यह एक सूची "फ़िल्टर" करने के लिए और अधिक चालाक होगा (उर्फ उपयोग var और केवल अंत में ToList() संलग्न करें)
संपादित करें: यह सबसे शर्मनाक सवाल है जिसे मैंने कभी भी पूछा है। मुझे पता था कि उदाहरण के लिए एक IQueryable पुनरावृत्ति करना बुरा होगा क्योंकि इससे डीबी से डेटा दो बार प्राप्त होगा। हालांकि मुझे स्मृति सूचियों में बिल्कुल यकीन नहीं था। मैं अगर मैं ;-)
हाँ, मुझे पता है कि। लेकिन सवाल यह है।Do DoomeWork() और DoSomeMoreWork() दोनों बड़ी सूची को फिर से शुरू करने का कारण बनेंगे या वे केवल सबसेट को फिर से सक्रिय करेंगे। – Christoph
@ क्रिस्टोफ - उत्तर अब संपादित किया गया है ..... –
उपयोग करने के लिए बेहतर। ToArray कि इस उपयोग के लिए ToList: सरणी कुछ हद तक अधिक कुशल हैं, लेकिन सबसे महत्वपूर्ण बात यह है कि वे अनावश्यक लचीलापन से बचने, जोड़ने/निकालने की अनुमति नहीं देते हैं (इस प्रकार भ्रम से परहेज करते हैं और कीड़े)। –