IEnumerable गारंटी नहीं देता है कि दो बार गणना करने से एक ही परिणाम मिलेगा। वास्तव में, यह एक उदाहरण बनाने के लिए काफी आसान है जहां myEnumerable.First()
विभिन्न मूल्यों लौटाता है जब दो बार मार डाला:क्या "गतिशील" IENumerable "ठीक" करने का कोई कैननिक तरीका है?
class A {
public A(string value) { Value = value; }
public string Value {get; set; }
}
static IEnumerable<A> getFixedIEnumerable() {
return new A[] { new A("Hello"), new A("World") };
}
static IEnumerable<A> getDynamicIEnumerable() {
yield return new A("Hello");
yield return new A("World");
}
static void Main(string[] args)
{
IEnumerable<A> fix = getFixedIEnumerable();
IEnumerable<A> dyn = getDynamicIEnumerable();
Console.WriteLine(fix.First() == fix.First()); // true
Console.WriteLine(dyn.First() == dyn.First()); // false
}
यह सिर्फ एक अकादमिक उदाहरण नहीं है: लोकप्रिय from ... in ... select new A(...)
का उपयोग वास्तव में इस स्थिति पैदा करेगा। यह अप्रत्याशित व्यवहार करने के लिए नेतृत्व कर सकते हैं:
fix.First().Value = "NEW";
Console.WriteLine(fix.First().Value); // prints NEW
dyn.First().Value = "NEW";
Console.WriteLine(dyn.First().Value); // prints Hello
मैं समझता हूँ कि ऐसा क्यों होता। मुझे यह भी पता है कि यह ToList()
निष्पादन योग्य या ==
को A
के लिए ओवरराइड करके निष्पादित करके तय किया जा सकता है। यह मेरा सवाल नहीं है।
सवाल यह है कि: जब आप एक ऐसी विधि लिखते हैं जो मनमाने ढंग से IENumerable लेता है और आप उस संपत्ति को चाहते हैं जो अनुक्रम का मूल्यांकन केवल एक बार किया जाता है (और फिर संदर्भ "निश्चित" होते हैं), ऐसा करने का कैननिक तरीका क्या है? ToList()
अधिकतर उपयोग किया जाता है, लेकिन यदि स्रोत पहले से तय किया गया है (उदाहरण के लिए, यदि स्रोत एक सरणी है), संदर्भों को एक सूची में कॉपी किया जाता है (अनावश्यक रूप से, क्योंकि मुझे केवल निश्चित संपत्ति की आवश्यकता है)। क्या इस मुद्दे के लिए कुछ और उपयुक्त है या ToList()
"कैननिकल" समाधान है?
परिभाषा के अनुसार एक आईनेमरेबल नहीं कहता है कि ऑर्डर की गारंटी नहीं है? यदि आपके कार्यान्वयन के लिए आदेश आवश्यक है तो आप गलत डेटाटाइप का उपयोग कर रहे हैं, नहीं? आप जो भी अपने अनुबंध में आईएन्यूमेरेबल के साथ पूछ रहे हैं वह यह है कि तत्वों को ट्रैव किया जा सकता है आईई: जैसा कि आप कहते हैं, एक सूची बेहतर अनुकूल है। –