سؤال

ولدي System.Collections.Generic.Dictionary<A, B> dict حيث A و B هي الطبقات، وA a المثال (حيث dict.ContainsKey(a) صحيح).

هل من الممكن الحصول على KeyValuePair تحتوي على a مباشرة من قاموس منتديات أو هل أنا بحاجة لخلق KeyValuePair الجديدة: new KeyValuePair<A, B>(a, dict[a])

هل كانت مفيدة؟

المحلول

وتحتاج إلى إنشاء KeyValuePair الجديدة <سوب> 1 - ولكن أن تضع في اعتبارها أن KVP هو نوع قيمة (البنية) أي حال، حتى انها ليست مثل كنت إدخال عدم الكفاءة جديدة من خلال ذلك. ومن شأن أي طريقة إرجاع KVP يتم إنشاء نسخة على أي حال - كنت مجرد خلق المثيل مباشرة

هل يمكن دائما إضافة طريقة تمديد IDictionary<TKey, TValue> إذا أردت:

public static KeyValuePair<TKey, TValue> GetEntry<TKey, TValue>
    (this IDictionary<TKey, TValue> dictionary,
     TKey key)
{
    return new KeyValuePair<TKey, TValue>(key, dictionary[key]);
}

وكما ذكر في تصريحات، فمن الممكن تماما أن المفتاح الذي يتم تخزينها في القاموس ليس <م> نفس كما هو المقدمة، فقط لغويا على قدم المساواة - من قبل بعض معاني الكلمات والتي يمكن تخصيصها من قبل IEqualityComparer (كما هو الحال مع القاموس تحسس حالة الأحرف، على سبيل المثال). وفي هذه الحالة، رمز أعلاه لن يعود دخول الفعلي في القاموس، ولكن إدخال مع المفتاح الذي قدمته للبحث عن. للأسف ليس هناك وسيلة فعالة لإيجاد المفتاح الأصلي - عليك أن تكرار عبر القاموس: (


<سوب> 1 كنت على علم أنك يمكن تكرار عبر مداخل القاموس والعثور على الإدخال المناسب بهذه الطريقة، ولكن أستطيع أن أرى أي سبب لماذا كنت من أي وقت مضى تريد أن تفعل ذلك عندما كنت قد حصلت مفهرس جيدة تماما وهو O (1) بدلا من O (N).

نصائح أخرى

وكما تنفذ Dictionary<TKey, TValue> IEnumerable<KeyValuePair<TKey, TValue>>، هل يمكن استخدام LINQ:

var pair = _dictionary.SingleOrDefault(p => p.Key == myKey);

ونحن لا يمكن الحصول على "IPHone" بهذه الطريقة:

var dict = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
               {
                   { "IPHone", "TCP/IP honing tools" }
               };

Console.WriteLine(dict["iPhone"]); // "TCP/IP honing tools"
Console.WriteLine( ??? ); // "IPHone"

وهناك يبدو أن هناك O (1) حل مع API الحالي، ولكن من خلال حلقات كل مقالات يعمل:

var keyValue = dict.First(p => dict.Comparer.Equals(p.Key, "iPhone"));

Console.WriteLine(keyValue.Key); // "IPHone"
Console.WriteLine(keyValue.Value); // "TCP/IP honing tools"

وأو امتدادا للكسول:

[Pure]
public static KeyValuePair<TKey, TValue> GetEntry<TKey, TValue>(this Dictionary<TKey, TValue> dictionary, TKey key)
{
    var comparer = dictionary.Comparer;
    return dictionary.FirstOrDefault(p => comparer.Equals(p.Key, key));
}

وبالنسبة لي myDict.AsEnumerable يفعل ذلك ...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top