Wie erhalten Sie den Schlüssel und Wert von Artikel aus OrderedDictionary nach Index?Wie bekomme ich Schlüssel von OrderedDictionary in C# nach Index?
Antwort
Es gibt keine direkte eingebaute Möglichkeit, dies zu tun. Dies liegt daran, dass der Schlüssel OrderedDictionary
der Index ist; Wenn Sie den eigentlichen Schlüssel möchten, müssen Sie ihn selbst verfolgen. Wahrscheinlich ist der direkteste Weg ist, um die Schlüssel zu einer Wende Sammlung zu kopieren:
// dict is OrderedDictionary
object[] keys = new object[dict.Keys.Count];
dict.Keys.CopyTo(keys, 0);
for(int i = 0; i < dict.Keys.Count; i++) {
Console.WriteLine(
"Index = {0}, Key = {1}, Value = {2}",
i,
keys[i],
dict[i]
);
}
Sie können dieses Verhalten in eine neue Klasse kapseln, die den Zugriff auf die OrderedDictionary
wickelt.
Ich habe einige Erweiterungsmethoden erstellt, die den Schlüssel per Index und den Wert per Schlüssel unter Verwendung des zuvor erwähnten Codes erhalten.
public static T GetKey<T>(this OrderedDictionary dictionary, int index)
{
if (dictionary == null)
{
return default(T);
}
try
{
return (T)dictionary.Cast<DictionaryEntry>().ElementAt(index).Key;
}
catch (Exception)
{
return default(T);
}
}
public static U GetValue<T, U>(this OrderedDictionary dictionary, T key)
{
if (dictionary == null)
{
return default(U);
}
try
{
return (U)dictionary.Cast<DictionaryEntry>().AsQueryable().Single(kvp => ((T)kvp.Key).Equals(key)).Value;
}
catch (Exception)
{
return default(U);
}
}
Wenn Sie beabsichtigen, Standardwerte zurückzugeben, wenn der Zielindex/Schlüssel nicht im Wörterbuch enthalten ist, haben Sie einen teuren Weg gewählt TU es. Ausnahmen sind im Vergleich zu normalen Kontrollflusskonstrukten wie if/else sehr teuer. Es wäre viel besser, nach Out-of-Bound-Indizes und nicht vorhandenen Schlüsseln zu suchen, als sich auf eine Ausnahme zu verlassen. – Odrade
Ich habe gleich, aber sehen einmal: OrderedDictionary list = Orderitems; Objekt strKey = Liste [e.OldIndex]; DictionaryEntry dicEntry = new DictionaryEntry(); foreach (DictionaryEntry DE in Liste) { if (DE.Value == strKey) { dicEntry.Key = DE.Key; dicEntry.Value = DE.Value; } } –
@RedSwan: Wo ist der Index? – testing
Der Index ist definitiv * nicht * der Schlüssel - das sind notwendigerweise verschiedene Konstrukte in einem '' OrderedDictionary''. – Conrad