none
удаление элементов в цикле RRS feed

  • Вопрос

  • Надо удалить элементы, находящиеся в промежутке от ymin до ymax по вертикали. В результате - ошибка(семейство изменилось). Может как-то обновить семейство в цикле, или можно поступить проще...
    foreach (UIElement del in mycanvas.Children) { if (Canvas.GetTop(del) > ymin) if (Canvas.GetTop(del) < ymax) { mycanvas.Children.Remove(del); } }
    • Перемещено Tagore Bandlamudi 3 октября 2010 г. 0:37 MSDN Forums consolidation (От:Форум по .NET Framework)

Ответы

  • Более элегантное решение с точки зрения краткости и выразительности через linq

          var elemsToRemoveFromCanvas = canvas.Children.
            Cast<UIElement>().
            Where(elem => Canvas.GetTop(elem) > ymin && Canvas.GetTop(elem) < ymax).ToList();
          elemsToRemoveFromCanvas.ForEach(elem => canvas.Children.Remove(elem));
    • Помечено в качестве ответа oBun-JIokoc 10 мая 2010 г. 21:05

Все ответы

  • foreach нельзя использовать для изменения коллекции,  для этой операции используйте for

    а лучше создайте список удаляемых элементов и после удалите их из коллекции

    • Предложено в качестве ответа Megano 8 мая 2010 г. 21:09
  • Как создать такой список без использования массива? через for не все элементы удаляются:

     int c=mycanvas.Children.Count;  (int i=0; i<c; i++) {if (canvas.GetTop(mycanvas.Children[i]>=ymin) if (canvas.GetTop(mycanvas.Children[i]<=ymax) {mycanvas.Children.Remove(mycanvas.Children[i];}}

  • Все-таки через for можно, надо было дописать пару присваиваний:

    int c=mycanvas.Children.Count;  (int i=0; i<c; i++) {if (canvas.GetTop(mycanvas.Children[i]>=ymin) if (canvas.GetTop(mycanvas.Children[i]<=ymax) {mycanvas.Children.Remove(mycanvas.Children[i]; i--; c--;}}

  • Более элегантное решение с точки зрения краткости и выразительности через linq

          var elemsToRemoveFromCanvas = canvas.Children.
            Cast<UIElement>().
            Where(elem => Canvas.GetTop(elem) > ymin && Canvas.GetTop(elem) < ymax).ToList();
          elemsToRemoveFromCanvas.ForEach(elem => canvas.Children.Remove(elem));
    • Помечено в качестве ответа oBun-JIokoc 10 мая 2010 г. 21:05