आपका प्रश्न, जैसा कि मैं समझता हूँ, यह एक गलत आधार पर लगता है। मुझे देखने दो कि क्या मैं तर्क का पुनर्निर्माण कर सकता हूं:
- लिंक्ड-इन लेख बताता है कि स्वचालित रूप से उत्पन्न अनुक्रम एक "आलसी" व्यवहार कैसे प्रदर्शित करते हैं, और यह दर्शाता है कि यह एक काउंटर-सहज परिणाम कैसे पैदा कर सकता है।
- इसलिए मैं यह पता लगा सकता हूं कि क्या IEnumerable का एक दिया गया उदाहरण इस आलसी व्यवहार को प्रदर्शित करने के लिए जाँच करने के लिए जा रहा है कि क्या यह स्वतः उत्पन्न होता है।
- मैं उसको कैसे करू?
समस्या यह है कि दूसरा आधार गलत है। यहां तक कि अगर आप यह पता लगा सकते हैं कि क्या दिया गया IEnumerable एक पुनरावृत्ति अवरोधक परिवर्तन का परिणाम था (और हाँ, वहाँ ऐसा करने के तरीके हैं) यह मदद नहीं करेगा क्योंकि धारणा गलत है। आइए बताते हैं क्यों।
class M { public int P { get; set; } }
class C
{
public static IEnumerable<M> S1()
{
for (int i = 0; i < 3; ++i)
yield return new M { P = i };
}
private static M[] ems = new M[]
{ new M { P = 0 }, new M { P = 1 }, new M { P = 2 } };
public static IEnumerable<M> S2()
{
for (int i = 0; i < 3; ++i)
yield return ems[i];
}
public static IEnumerable<M> S3()
{
return new M[]
{ new M { P = 0 }, new M { P = 1 }, new M { P = 2 } };
}
private class X : IEnumerable<M>
{
public IEnumerator<X> GetEnumerator()
{
return new XEnum();
}
// Omitted: non generic version
private class XEnum : IEnumerator<X>
{
int i = 0;
M current;
public bool MoveNext()
{
current = new M() { P = i; }
i += 1;
return true;
}
public M Current { get { return current; } }
// Omitted: other stuff.
}
}
public static IEnumerable<M> S4()
{
return new X();
}
public static void Add100(IEnumerable<M> items)
{
foreach(M item in items) item.P += 100;
}
}
ठीक है, हमारे पास चार तरीके हैं। S1 और S2 स्वतः उत्पन्न होते हैं; S3 और S4 मैन्युअल रूप से उत्पन्न अनुक्रम हैं। अब मान लें कि हमारे पास:
var items = C.Sn(); // S1, S2, S3, S4
S.Add100(items);
Console.WriteLine(items.First().P);
एस 1 और एस 4 के लिए परिणाम 0 होगा; हर बार जब आप अनुक्रम की गणना करते हैं, तो आपको एक एम बनाया गया ताज़ा संदर्भ मिलता है। S2 और S3 के लिए परिणाम 100 होगा; हर बार जब आप अनुक्रम की गणना करते हैं, तो आपको एम के लिए वही संदर्भ मिलता है जो आपको पिछली बार मिला था। अनुक्रम कोड स्वचालित रूप से उत्पन्न होता है या नहीं, इस सवाल के लिए रूढ़िवादी है कि क्या संकलित वस्तुओं में संदर्भात्मक पहचान है या नहीं। उन दो संपत्तियों - स्वचालित पीढ़ी और संदर्भीय पहचान - का वास्तव में एक-दूसरे से कोई लेना-देना नहीं है। आपके द्वारा लिंक किया गया लेख उन्हें कुछ हद तक भ्रमित करता है।
जब तक एक अनुक्रम प्रदाता को हमेशा ऑब्जेक्ट्स को संदर्भित करने के रूप में प्रलेखित नहीं किया जाता है जिनकी संदर्भात्मक पहचान होती है , तो यह मान लेना नासमझी है कि वह ऐसा करता है।
ICollection<T>
चाहिए, एक बेहतर विकल्प होगा क्योंकि सभी संग्रह नहीं हैंList<T>
। उदाहरण के लिए, सरणियाँPoint[]
लागू होती हैं,IList<T>
लेकिन नहीं हैंList<T>
।