Петли для удаления ненужных линий


У меня есть следующий метод:

private void removeUnnecessaryLines(List<ScatterViewItem> list)
{
    List<Line> remove = new List<Line>();
    foreach (Line line in lines)
    {
        SourceFile destination = (line.Tag as Call).getCallee();

        foreach (ScatterViewItem svi in list)
        {
            SourceFile test = svi.Tag as SourceFile;
            if (test.Equals(destination))
            {
                remove.Add(line);
            }
        }
    }

    foreach (Line l in remove)
    {
        lines.Remove(l);
        Dependencies.Children.Remove(l);
    }
}

Как вы можете видеть, есть много итераций и литья. Есть простой способ улучшить это?



702
10
задан 30 января 2011 в 03:01 Источник Поделиться
Комментарии
2 ответа

Наиболее очевидное улучшение можно было бы использовать LINQ там , где способ, чтобы отфильтровать строки списка, а не выстраивая список удаленных элементов, а затем их удаления. В дополнение к тому, что легче читать и понимать, он будет иметь преимущество своего выполнения, не будучи квадратичной длины линии.

Вы можете также использовать список.Метод removeall метод, который принимает предикат, как и где (хотя предикат указывает на предметы, чтобы быть удалены, так что в некотором смысле, это противоположность , где), но изменяет список на месте, как ваше решение сделал.

13
ответ дан 30 января 2011 в 04:01 Источник Поделиться


  1. Я бы не стал настаивать на замене линий.Снять с линии = линии.Где(...). Я считаю, что эта замена является субъективным, поскольку вам все равно нужно убирать одинаковые линии от зависимостей.Детская коллекция. Вместо этого я хотел изменить еогеасп заявление.

  2. Если вы не проверяя тест == значение NULL, то вместо теста = сви.Тег в файле, я хотел бы использовать тест = (исходного)сви.Тег. Для ReSharper говорит то же самое.

  3. Второй вложенный цикл foreach , безусловно, содержится заявление

  4. Переименовать удалить -> linesToRemove с удалить не существительное

  5. Интерфейс IEnumerable<> для параметра метода, а не список<>

  6. Лучшее имя для списка параметров? Не понятно, что это параметр, используемый для Из сигнатуры метода

  7. Почему не UpperCamelCase?

Результат:

private static void RemoveUnnecessaryLines(IEnumerable<ScatterViewItem> list)
{
var linesToRemove = lines
.Select(line => ((Call)line.Tag).getCallee())
.Where(destination => list.Any(svi => Equals(svi.Tag, destination)))
.ToList();

foreach (Line l in linesToRemove)
{
lines.Remove(l);
Dependencies.Children.Remove(l);
}
}

1
ответ дан 1 февраля 2011 в 10:02 Источник Поделиться