असल में आपको यह तय करने की ज़रूरत है कि कक्षा के उपयोगकर्ताओं को इस तथ्य से भ्रमित होने की संभावना है कि वे नहीं कर सकते हैं, उदाहरण के लिए, ऐसा करें:
for(int i=0; i=< myCollection.Count; i++)
{
... myCollection[i] ...
}
हालांकि वे निश्चित रूप से foreach का उपयोग कर सकते हैं, या एक कास्ट का उपयोग कर सकते हैं:
for(int i=0; i=< myCollection.Count; i++)
{
... ((Collection)myCollection)[i] ...
}
यह एक आसान निर्णय नहीं है, क्योंकि यह आसानी से हेज़ेनबग का नेतृत्व कर सकता है। मैंने इसे अपने ऐप्स में से किसी एक में अनुमति देने का निर्णय लिया, जहां कक्षा के उपयोगकर्ताओं से पहुंच मुख्य रूप से कुंजी द्वारा थी।
I'm not sure I'd do so for a shared class library though: in general I'd avoid exposing a KeyedCollection in a public API: instead I would expose IList in a public API, and consumers of the API who need keyed access can define their own internal KeyedCollection with a constructor that takes an IEnumerable and populates the collection with it. This means you can easily build a new KeyedCollection from a list retrieved from an API.
क्रमबद्धता के संबंध में, एक प्रदर्शन समस्या भी है जो मैंने माइक्रोसॉफ्ट कनेक्ट की सूचना दी : कीड कोलेक्शन एक आंतरिक शब्दकोश के साथ-साथ एक सूची बनाए रखता है, और दोनों को क्रमबद्ध करता है - यह सूची को क्रमबद्ध करने के लिए पर्याप्त है क्योंकि शब्दकोश को आसानी से deserialization पर पुनर्निर्मित किया जा सकता है।
इस कारण के साथ-साथ XmlSerialization बग, मैं आपको एक KeyedCollection को क्रमबद्ध करने से बचने की सलाह दूंगा - इसके बजाय केवल KeyedCollection.Items सूची को क्रमबद्ध करें।
मुझे किसी अन्य प्रकार में अपनी int कुंजी लपेटने का सुझाव । ऐसा लगता है कि जटिलता को जोड़ने में मुझे गलत लगता है ताकि एक प्रकार को किसी कुंजी के रूप में एक कुंजी के रूप में उपयोग किया जा सके। मैं ऐसा करने के बजाय एक स्ट्रिंग कुंजी (ToString) का उपयोग करता हूं - यह वीबी 6 संग्रह वर्ग की तरह है।
एफडब्ल्यूआईडब्ल्यू, मैंने पूछा कुछ समय पहले एमएसडीएन मंचों पर एक ही सवाल । FxCop टीम के एक सदस्य से एक प्रतिक्रिया है, लेकिन कोई निर्णायक दिशानिर्देश नहीं है।