λήψη κλειδιού λεξικού με τιμή

Πώς μπορώ να πάρω ένα κλειδί λεξικού με βάση την τιμή σε C#;

Dictionary<string, string> types = new Dictionary<string, string>()
{
            {"1", "one"},
            {"2", "two"},
            {"3", "three"}
};

Θέλω κάτι τέτοιο:

getByValueKey(string value);

getByValueKey("one") πρέπει να επιστρέφει "1".

Ποιος είναι ο καλύτερος τρόπος για να γίνει αυτό; Ίσως HashTable, SortedLists?

Λύση

Οι τιμές δεν πρέπει απαραίτητα να είναι μοναδικές, οπότε πρέπει να κάνετε μια αναζήτηση. Μπορείτε να κάνετε κάτι τέτοιο:

var myKey = types.FirstOrDefault(x => x.Value == "one").Key;

Αν οι τιμές είναι μοναδικές και εισάγονται λιγότερο συχνά από ότι διαβάζονται, τότε δημιουργήστε ένα αντίστροφο λεξικό όπου οι τιμές είναι κλειδιά και τα κλειδιά είναι τιμές.

Σχόλια (13)

Μπορείς να το κάνεις αυτό:

  1. Με βρόχο σε όλα τα KeyValuePair's στο λεξικό (το οποίο θα είναι ένα σημαντικό χτύπημα απόδοσης αν έχετε πολλές καταχωρήσεις στο λεξικό)
  2. Χρησιμοποιήστε δύο λεξικά, ένα για την αντιστοίχιση τιμής σε κλειδί και ένα για την αντιστοίχιση κλειδιού σε τιμή (το οποίο θα καταλάμβανε διπλάσιο χώρο στη μνήμη).

Χρησιμοποιήστε τη μέθοδο 1 εάν η απόδοση δεν είναι σημαντικός παράγοντας, χρησιμοποιήστε τη μέθοδο 2 εάν η μνήμη δεν είναι σημαντικός παράγοντας.

Επίσης, όλα τα κλειδιά πρέπει να είναι μοναδικά, αλλά οι τιμές δεν απαιτείται να είναι μοναδικές. Μπορείτε να έχετε περισσότερα από ένα κλειδιά με την καθορισμένη τιμή.

Υπάρχει κάποιος λόγος που δεν μπορείτε να αντιστρέψετε τη σχέση κλειδιού-τιμής;

Σχόλια (2)

Έχω έναν πολύ απλό τρόπο για να το κάνω αυτό. Δούλεψε τέλεια για μένα.

Dictionary types = new Dictionary();

types.Add("1", "one");
types.Add("2", "two");
types.Add("3", "three");

Console.WriteLine("Please type a key to show its value: ");
string rLine = Console.ReadLine();

if(types.ContainsKey(rLine))
{
    string value_For_Key = types[rLine];
    Console.WriteLine("Value for " + rLine + " is" + value_For_Key);
}
Σχόλια (3)