سؤال

وهكذا، ولدي علة لإزالة

foreach (XElement x in items.Elements("x")) 
{
    XElement result = webservice.method(x);

    if (/*condition based on values in result*/) 
    {
        x.Remove();
    }
}

والمشكلة هي أن يدعو x.Remove () يغير من foreach هذه أنه إذا كان هناك نوعان من عناصر ( "س")، وإزالة أولا، حلقة لا تحصل على العنصر س الثاني.

وهكذا وكيف ينبغي أن تكون حلقات هذا؟ أم أن ذلك إعادة صياغة طريقة أخرى؟

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

المحلول

وأظن أن ينق قد تكون قادرة على مساعدتك هنا على النحو التالي.

using System.Linq;

void foo()
{
    items.Elements("x")
         .Where(x => condition(webservice.method(x)))
         .Remove();
}

إذا لم يفلح ذلك (أي العداد الداخلي لا يزال يفسد)، وجعل نسخة الضحلة من العناصر المحددة وحذفها كما يلي.

using System.Linq;

void foo()
{
    List xElements = items.Elements("x")
                          .Where(x => condition(webservice.method(x)))
                          .ToList();

    for (int i = xElements.Count - 1; i > -1; i--)
    {
        xElements[i].Remove();
    }
}

نصائح أخرى

وإنشاء مجموعة قبل منطق حلقة، إضافة عناصر إلى إزالتها إلى مجموعة جديدة، ثم استدعاء items.Remove على كل عنصر في المجموعة الجديدة.

وجربها دون لبدلا من foreach.

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