एक संख्यात्मक अनुक्रमणिका के माध्यम से एक शब्दकोश। कुंजी कुंजी का उपयोग करना

I'm using a Dictionary where the int is a count of the key.

अब, मुझे शब्दकोश के अंदर अंतिम डाली गई कुंजी तक पहुंचने की ज़रूरत है, लेकिन मुझे इसका नाम पता नहीं है। स्पष्ट प्रयास:

int LastCount = mydict[mydict.keys[mydict.keys.Count]];

काम नहीं करता है, क्योंकि Dictionary.Keys एक [] -indexer लागू नहीं करता है।

I just wonder if there is any similar class? I thought about using a Stack, but that only stores a string. I could now create my own struct and then use a Stack, but I wonder if there is another alternative, essentially a Dictionary that implements an []-indexer on the Keys?

0
ro fr bn
यदि आप उस बॉक्स को चर करते हैं तो क्या होता है?
जोड़ा लेखक Paul Prewett, स्रोत

9 उत्तर

मैं पैट्रिक के जवाब के दूसरे भाग से सहमत हूं। यहां तक ​​कि अगर कुछ परीक्षणों में यह सम्मिलन आदेश रखना प्रतीत होता है, दस्तावेज़ीकरण (और शब्दकोश और हश के लिए सामान्य व्यवहार) स्पष्ट रूप से आदेश देता है कि ऑर्डरिंग अनिर्दिष्ट है।

आप केवल चाबियों के क्रम के आधार पर परेशानी मांग रहे हैं। सुनिश्चित करने के लिए अपनी खुद की बहीखाता जोड़ें (जैसे पैट्रिक ने कहा, अंतिम जोड़ा कुंजी के लिए केवल एक चर)। साथ ही, शब्दकोश पर अंतिम और अधिकतम जैसी सभी विधियों से मोहब्बत न करें क्योंकि वे शायद मुख्य तुलनित्र के संबंध में हैं (मुझे इसके बारे में निश्चित नहीं है)।

0
जोड़ा

मुझे नहीं पता कि यह काम करेगा या नहीं, क्योंकि मुझे पूरा यकीन है कि कुंजी जोड़े गए क्रम में संग्रहीत नहीं हैं, लेकिन आप KeysCollection को किसी सूची में डाल सकते हैं और फिर सूची में अंतिम कुंजी प्राप्त कर सकते हैं ... लेकिन यह एक नजर रखने लायक होगा।

एकमात्र अन्य चीज जो मैं सोच सकता हूं वह कुंजी को लुकअप सूची में स्टोर करना है और सूची में कुंजी जोड़ने से पहले सूची में कुंजी जोड़ना है ... यह बहुत कुछ नहीं है।

0
जोड़ा
@ जुआन: KeyCollection पर कोई .ast() विधि नहीं है
जोड़ा लेखक lomaxx, स्रोत
मैंने कोड का परीक्षण नहीं किया, लेकिन विधि को [एमएसडीएन] [1] पर दस्तावेज किया गया है शायद यह एक और संस्करण ढांचा है? [1]: msdn.microsoft.com/en-us/library/bb908406। aspx
जोड़ा लेखक Juan, स्रोत
2 साल देर हो चुकी है लेकिन यह किसी की मदद कर सकती है ... नीचे जुआन की पोस्ट का मेरा जवाब देखें। अंतिम() एक विस्तार विधि है।
जोड़ा लेखक SuperOli, स्रोत

जिस तरह से आपने प्रश्न पूछा है, मुझे विश्वास है कि शब्दकोश में int में शब्दकोश की "स्थिति" है। इस धारणा से निर्णय लेते हुए कि कुंजी को जोड़े गए क्रम में संग्रहीत नहीं किया गया है, यदि यह सही है, तो इसका मतलब यह होगा कि चाबियाँ। गणना (या गणना - 1, यदि आप शून्य-आधारित का उपयोग कर रहे हैं) अभी भी हमेशा अंतिम प्रविष्टि कुंजी की संख्या हो?

If that's correct, is there any reason you can't instead use Dictionary so that you can use mydict[ mydict.Keys.Count ]?

0
जोड़ा

आप एक OrderedDictionary का उपयोग कर सकते हैं।

कुंजी / मान का संग्रह दर्शाता है   कुंजी जो कुंजी द्वारा सुलभ हैं   या सूचकांक।

0
जोड़ा
एर्म, 1 9 अपवॉट्स के बाद, किसी ने भी उल्लेख नहीं किया कि ऑर्डर्ड डिक्शनरी अभी भी इंडेक्स द्वारा कुंजी प्राप्त करने की अनुमति नहीं देती है?
जोड़ा लेखक Lazlo, स्रोत
आप एक OrderedDictionary के साथ एक पूर्णांक अनुक्रमणिका वाले मान तक पहुंच सकते हैं, लेकिन System.Collections.Generic.SortedDictionary के साथ नहीं जहां सूचकांक को होना आवश्यक है TKey
जोड़ा लेखक Maxence, स्रोत

आप हमेशा ऐसा कर सकते हैं:

string[] temp = new string[mydict.count];
mydict.Keys.CopyTo(temp, 0)
int LastCount = mydict[temp[mydict.count - 1]]

लेकिन मैं इसकी सिफारिश नहीं करता। इस बात की कोई गारंटी नहीं है कि अंतिम डाली गई कुंजी सरणी के अंत में होगी। कुंजी के लिए ऑर्डरिंग एमएसडीएन पर अनिर्दिष्ट है, और परिवर्तन के अधीन है। मेरे बहुत ही संक्षिप्त परीक्षण में, यह सम्मिलन के क्रम में प्रतीत होता है, लेकिन आप एक स्टैक की तरह उचित बहीखाता में निर्माण करना बेहतर होगा - जैसा कि आप सुझाव देते हैं (हालांकि मुझे आपके आधार पर एक संरचना की आवश्यकता नहीं दिखाई दे रही है अन्य कथन) - या एकल परिवर्तनीय कैश यदि आपको केवल नवीनतम कुंजी जानना है।

0
जोड़ा

आखिरी कुंजी डालने वाली संपत्ति में जोड़ने के लिए आप सिर्फ डिक्शनरी क्लास का विस्तार क्यों नहीं करते हैं। शायद कुछ की तरह कुछ?

public class ExtendedDictionary : Dictionary
{
    private int lastKeyInserted = -1;

    public int LastKeyInserted
    {
        get { return lastKeyInserted; }
        set { lastKeyInserted = value; }
    }

    public void AddNew(string s, int i)
    {
        lastKeyInserted = i;

        base.Add(s, i);
    }
}
0
जोड़ा
एह? नहीं, मैं नहीं हूँ(?)
जोड़ा लेखक Calanus, स्रोत
आप आखिरी मूल्य डालने वाले अंतिम मूल्य को सेट कर रहे हैं। या तो आप इसे अंतिम कुंजी डालने के लिए सेट करना चाहते थे या आपको चर और संपत्ति के लिए बेहतर नामों की आवश्यकता है।
जोड़ा लेखक Fantius, स्रोत

मुझे लगता है कि आप ऐसा कुछ कर सकते हैं, वाक्यविन्यास गलत हो सकता है, थोड़ी देर में सी # का उपयोग किया जाता है अंतिम आइटम प्राप्त करने के लिए

Dictionary.KeyCollection keys = mydict.keys;
string lastKey = keys.Last();

या अधिकतम मूल्य प्राप्त करने के लिए अंतिम के बजाय मैक्स का उपयोग करें, मुझे नहीं पता कि कौन सा आपके कोड को बेहतर बनाता है।

0
जोड़ा
आखिरकार इसे आज़माएं (जब एक dist का उपयोग करते समय स्पष्ट रूप से :-) KeyValuePair last = oAuthPairs.Last (); अगर (kvp.Key! = last.Key) {_oauth_ParamString = _oauth_ParamString + "&"; }
जोड़ा लेखक Tim Windsor, स्रोत
मैं जोड़ूंगा क्योंकि "अंतिम ()" एक विस्तार विधि है, इसलिए आपको .NET Framework 3.5 की आवश्यकता होगी और अपनी .cs फ़ाइल के शीर्ष पर "System.Linq का उपयोग करके" जोड़ना होगा।
जोड़ा लेखक SuperOli, स्रोत

In case you decide to use dangerous code that is subject to breakage, this extension function will fetch a key from a Dictionary according to its internal indexing (which for Mono and .NET currently appears to be in the same order as you get by enumerating the Keys property).

लिंकक का उपयोग करना बहुत बेहतर है: dict.Keys.ElementAt (i) , लेकिन वह फ़ंक्शन ओ (एन) को फिर से चालू करेगा; निम्नलिखित ओ (1) है लेकिन एक प्रतिबिंब प्रदर्शन दंड के साथ।

using System;
using System.Collections.Generic;
using System.Reflection;

public static class Extensions
{
    public static TKey KeyByIndex(this Dictionary dict, int idx)
    {
        Type type = typeof(Dictionary);
        FieldInfo info = type.GetField("entries", BindingFlags.NonPublic | BindingFlags.Instance);
        if (info != null)
        {
            // .NET
            Object element = ((Array)info.GetValue(dict)).GetValue(idx);
            return (TKey)element.GetType().GetField("key", BindingFlags.Public | BindingFlags.Instance).GetValue(element);
        }
        // Mono:
        info = type.GetField("keySlots", BindingFlags.NonPublic | BindingFlags.Instance);
        return (TKey)((Array)info.GetValue(dict)).GetValue(idx);
    }
};
0
जोड़ा
हम्म, जवाब में सुधार करने के लिए संपादन एक downvote अर्जित किया। क्या मैंने यह स्पष्ट नहीं किया कि कोड (स्पष्ट रूप से) घृणास्पद है, और तदनुसार विचार किया जाना चाहिए?
जोड़ा लेखक Glenn Slayden, स्रोत

जैसा कि @ फलनवे एक टिप्पणी में बताते हैं, ऐसा कुछ करना गलत है:

int LastCount = mydict.Keys.ElementAt(mydict.Count -1);

आप शब्दकोश में कुंजी के क्रम पर नहीं होना चाहिए निर्भर करते हैं। अगर आपको ऑर्डर करने की आवश्यकता है, तो आपको एक OrderedDictionary , जैसा कि इस उत्तर में सुझाया गया है। इस पृष्ठ पर अन्य उत्तरों भी दिलचस्प हैं।

0
जोड़ा
यह इतना डरावना गलत जवाब देखने के लिए डरावना है और इतना अधिक उत्साहित है। यह गलत है क्योंकि, शब्दकोश < टीके, टीवीएयू> दस्तावेज़ीकरण कहता है " शब्दकोश .KeyCollection में कुंजी का क्रम निर्दिष्ट नहीं है।" आदेश अपरिभाषित किया जा रहा है, आपके पास निश्चित स्थिति के बारे में जानने का कोई तरीका नहीं है ( mydict.Count -1 )
जोड़ा लेखक Falanwe, स्रोत
यह डरावना है ... लेकिन मेरे लिए सहायक है क्योंकि मैं अपने संदेह की पुष्टि की तलाश कर रहा था कि आप नहीं कर सकते ऑर्डर पर गिनें !!! धन्यवाद @ फलनवे
जोड़ा लेखक Charlie, स्रोत
ऐसा लगता है कि हैशटेबल System.Collections.ICollection 'में' ElementAt 'की परिभाषा नहीं है और' System.Collections.icollection 'प्रकार का पहला तर्क स्वीकार करने वाला कोई एक्सटेंशन विधि' ElementAt 'नहीं हो सकता है मिल गया
जोड़ा लेखक v.oddou, स्रोत
कुछ के लिए आदेश प्रासंगिक नहीं है - केवल तथ्य यह है कि आप सभी चाबियों के माध्यम से गए थे।
जोड़ा लेखक Royi Mindel, स्रोत
अपवाद रहित संस्करण के साथ काम करने के लिए आप ElementAtOrDefault संस्करण का उपयोग कर सकते हैं।
जोड़ा लेखक Tarık Özgün Gün, स्रोत