كيف يمكنك إرجاع نسخة من قائمة الأصلي من وظائفها ؟
سؤال
ولقد تبين (في الطريق الصعب) أن المجموعة التي يتم المذكورة لا يمكن تعديل ضمن "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، قد يصبح العداد الأصلي غير صالحة، وبالتالي فإن الحاجة لإنشاء نسخة وإجراء التعديلات الخاصة بك هناك.