ListBox의 메소드를 제거하는 메소드 대신 Foreach 메소드를 어떻게 사용할 수 있습니까?

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, 그런 다음 a 분리된 먼저 목록 - 예를 들어 :

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 루프에서 반복하는 컬렉션을 수정할 수 없습니다.

즉, ListBox에서 선택한 항목을 제거하려고하는 것 같습니다. 다음과 같은 것을 사용할 수도 있습니다.

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

글쎄, 당신은 oreach를 사용하여 Ilist <>를 변경할 수 없습니다. 단순히 항목 수를 변경하기 때문입니다.

또한, 당신이 보여주는 첫 번째 방법은 결함이 있습니다. count는 20으로 시작할 수 있지만 방법으로 10 개의 항목을 제거하면 Count는 여전히 20이며 Ilist <>의 경계를 벗어납니다.

기본적으로 반복하는 동안 물건을 제거 / 추가하려면 다음과 같은 작업을 수행해야합니다.

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

I를 확인하십시오. 항목 [2]이 선택되었다고 가정 해 봅시다. 루프가 갈 것이라고 가정 해 봅시다.

  1. count> 0이 진행되는 경우
  2. 항목 [0]이 선택되면 제거하십시오 (그렇지 않음)
  3. 우리 카운터를 증가시킵니다
  4. 카운트> 1이 진행되는 경우
  5. 항목 [1]이 선택되면 제거하십시오 (그렇지 않음)
  6. 우리 카운터를 증가시킵니다
  7. 카운트> 2가 진행되는 경우
  8. 항목 [2]이 선택되어 제거합니다 (IT IS)
  9. 항목 제거 [2] (이제, 이전 항목 [3]은 항목 [2]입니다.
  10. 카운터를 줄입니다
  11. 우리 카운터를 증가시킵니다
  12. 카운트> 2가 진행되는 경우
  13. ...

도움이 되었기를 바랍니다 :)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top