كيف يمكنك إرجاع نسخة من قائمة الأصلي من وظائفها ؟

StackOverflow https://stackoverflow.com/questions/615310

سؤال

ولقد تبين (في الطريق الصعب) أن المجموعة التي يتم المذكورة لا يمكن تعديل ضمن "Foreach" بيان

<اقتباس فقرة>   

و"تم تعديل مجموعة؛ عملية التعداد قد يتم تنفيذ"

والآن، فإن الحل خطرت لي هو إنشاء مجموعة وهمية من نفس الحجم يحتوي على مفتاح القاموس وتعداد أكثر من ذلك لتعديل مجموعة في المسألة.

    private void InvalidateAuthenticatedNodes()
    {
        var dummy = new Dictionary<int, bool>(_AuthenticatedNodes.Count);
        foreach (var nodeId in _AuthenticatedNodes.Keys)
            dummy[nodeId] = false;

        foreach (var nodeId in dummy.Keys)
            _AuthenticatedNodes[nodeId] = false;

        ClearAuthenticatedDateTime();
    }

وفوق رمز عملت بشكل جيد. كنت في عملية إعادة بيع ديون فوق رمز لاستخدام مندوب وظائفها لإرجاع نسخة من مفاتيح على النحو التالي

    private void InvalidateAuthenticatedNodes()
    {
        var getNodeIds = 
            new Func<Dictionary<int, bool>, IEnumerable<int>>(
                nodes => nodes.Select(node => node.Key));
        foreach (var nodeId in getNodeIds(_AuthenticatedNodes))
        {
            _AuthenticatedNodes[nodeId] = false;
        }

        ClearAuthenticatedDateTime();
    }

وعلى عكس ما كان يتوقع، <م> getNodeIds لا يرجع نسخة. هل هناك طريقة للعودة إلى نسخة بدلا من ذلك؟

<قوية> * تحرير : في النتيجة المؤقتة قبل <وأ href = "https://stackoverflow.com/questions/615310/how-do-you-return-a-copy-of-original-listt -من-وظي-tresult / 615314 # 615314 "> الجواب JaredPar في

وعلى غرار الجواب JaredPar ولكن كان له أكثر إيجازا وذهبت مع جوابه. ولكن هنا هو نتيجة مماثلة خطرت لي للمشاركة.

    private void InvalidateAuthenticatedNodes()
    {
        var getNodeIds = 
            new Func<Dictionary<int, bool>, IEnumerable<int>>(nodes => 
                nodes.Select(node => node.Key));
        foreach (var nodeId in getNodeIds(_AuthenticatedNodes).ToList())
        {
            _AuthenticatedNodes[nodeId] = false;
        }

        ClearAuthenticatedDateTime();
    }

<قوية> * تحرير : في النتيجة النهائية (المكرر)

_AuthenticatedNodes.Keys.ToList().ForEach(
    nodeId => _AuthenticatedNodes[nodeId] = false);
هل كانت مفيدة؟

المحلول

ومجرد إضافة .ToList () إلى نهاية المجموعة وسيعود التلقائى نسخة كاملة من القائمة.

foreach (var nodeId in _AuthenticatedNodes.Keys.ToList())
    ...

نصائح أخرى

وبدلا من استخدام foreach، هل يمكن استخدام العادي ل. ومع ذلك، وتوخي الحذر عند إضافة / إزالة العناصر، فإنه يغير فهارس عناصر داخل المجموعة.

وبمجرد تغيير فئة Enumerable، قد يصبح العداد الأصلي غير صالحة، وبالتالي فإن الحاجة لإنشاء نسخة وإجراء التعديلات الخاصة بك هناك.

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