كيف يمكنني استخدام الأسلوب Foreach بدلا من الأسلوب Witn إزالة طريقة ListBox؟

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

  •  23-08-2019
  •  | 
  •  

سؤال

كيف يمكنني استخدام ثانيا طريقة بدلا من أول?

أولا (عنصر تحكم مستخدم الويب)

   public void Remove()
        {

            int count = this.ListBox1.Items.Count;

            for (int i = count - 1; i > -1; i--)
            {
                if (ListBox1.Items[i].Selected)
                {
                    ListBox1.Items.Remove(ListBox1.Items[i]);
                }
            }
        }

test.aspx (اختبار الأول)

  protected void btnRemove_Click(object sender, EventArgs e)
        {
            ItemOrderer2.Remove();

        }

ثانيا (التحكم في مستخدمي الويب)

 public void Remove(string value)
        {
            ListItem li = new ListItem();
            li = ListBox1.Items.FindByValue(value);
            if (li != null)
            {
                this.ListBox1.Items.Remove(li);
            }

test.aspx (اختبار الثاني)

  protected void btnRemove_Click(object sender, EventArgs e)
        {
           // ItemOrderer2.Remove();
            if (ItemOrderer2.Items.Count > 0)
                foreach (ListItem li in ItemOrderer2.Items)
                {
                    if (li.Selected)
                    {
                        ItemOrderer2.Remove(li.Value);
                    }
                }
        }
هل كانت مفيدة؟

المحلول

لا يمكنك استخدام foreach إذا كنت تقوم بإزالة البيانات داخل foreach - إنه (عمدا) يكسر المؤتمر.

إذا for يعمل، لماذا تغييره؟ إذا كنت متحرق إلى ليستخدم foreach, ، ثم بناء متفرق قائمة الأول - على سبيل المثال:

List<ListItem> remove = new List<ListItem>();
foreach(ListItem li in ItemOrdere2.Items) {
    if(li.Selected) remove.Add(li);
}
foreach(ListItem li in remove) {
    ItemOrderer2.Remove(li); // or similar
}

غالبا ما يتم تبسيط الاستعلام الأول بواسطة LinQ إذا كان متاحا.

نصائح أخرى

يمكنك الحصول على القيم المراد إزالتها أولا إلى قائمة ثم قم بتشغيلها من خلال وظيفة إزالة. يمكن تعزيز ذلك إذا لزم الأمر.

var removedValues = ItemOrderer2.Items
                    .Where(li => li.Selected)
                    .Select(li => li.Value).ToList();

foreach (var removedValue in removedValues) {
   ItemOrderer2.Remove(removedValue);
}

لا يمكنك تعديل مجموعة تكرارها في حلقة Foreach.

يقال، يبدو أنك تحاول إزالة العناصر المحددة من مربع القائمة. يمكنك أيضا استخدام شيء مثل:

while(ItemOrderer2.SelectedItem != null)
{
    ItemOrderer2.Items.Remove(ItemOrderer2.SelectedItem);
}

حسنا، لا يمكنك إجراء أي تغييرات على Ilist <> مع foreach، ببساطة لأنه سيغير عدد العناصر الموجودة فيه.

أيضا، الطريقة الأولى التي أظهرتها هي معيبة، نظرا لأن العد يمكن أن يبدأ من 20 عاما ولكن إذا قمت بإزالة 10 عناصر مع طريقتك، فسيظل العد 20 عاما وأنت تخرج من حدود Ilist <>

في الأساس، إذا كنت ترغب في إزالة / إضافة أشياء أثناء التكرار بشأنها، عليك أن تفعل شيئا مثل

for (int i = 0; i < ListBox1.Items.Count; i++)
{
   if (ListBox1.Items[i].Selected)
   {
      ListBox1.Items.RemoveAt(i)
      i--;
   }
}

لاحظ أنا - إذا قمت بإزالة أي شيء. دعنا نقول أن البند [2] محدد، سوف تذهب حلقة الخاص بك:

  1. إذا كان العد> 0 المضي قدما
  2. إذا تم تحديد العنصر [0]، فقم بإزالته (ليس كذلك)
  3. زيادة عدادنا
  4. إذا كان العد> 1 المضي قدما
  5. إذا تم تحديد العنصر [1]، فقم بإزالته (ليس كذلك)
  6. زيادة عدادنا
  7. إذا كان العد> 2 المضي قدما
  8. تم تحديد العنصر [2]، وإزالته (إنه)
  9. إزالة العنصر [2] (الآن، ما كان العنصر سابقا [3] سيكون العنصر [2
  10. انخفاض عدادنا
  11. زيادة عدادنا
  12. إذا كان العد> 2 المضي قدما
  13. ...

أتمنى أن يساعدك هذا :)

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