В очень старой кодовой базе, которую я унаследовал, есть метод с этой подписью

public static void Remove<TSource>(this ICollection<TSource> source, Func<TSource, bool> predicate)

И я пытаюсь вызвать этот метод в массиве. Массив называется Items и является свойством раздела.

section.Items.Remove(// what goes here?)

Items - это массив продуктов.

Для наглядности вот метод Remove

    public static void Remove<TSource>(this ICollection<TSource> source, Func<TSource, bool> predicate)
    {
        var items = source.ToArray();
        for (var index = items.Length - 1; index >= 0; index--)
        {
            var item = items[index];
            if (predicate.Invoke(item))
            {
                source.Remove(item);
            }
        }
    }
c#
1
andrewb 4 Окт 2018 в 19:10

1 ответ

Лучший ответ

Вам необходимо передать лямбда-выражение, чтобы отфильтровать то, что удаляется (если имя параметра и функция логичны)

Например:

section.Items.Remove(p => p.Id == 1);

Это должно удалить все элементы с идентификатором 1 (при условии, что такое свойство существует)

Примечание . Трудно сказать, что именно делает метод, поскольку размер массивов изменить нельзя. Метод принимает ICollection, элементы которого можно удалить, но вы говорите, что передаете массив. При вызове ICollection.Remove массив выдаст ошибку.

Изменить

Поскольку вы разместили код метода, я могу с уверенностью сказать, что метод не работает для массива. Это будет работать для других реализаций ICollection (например, List).

Просто хочу отметить, что я бы не стал использовать этот метод для удаления большого количества элементов из больших коллекций, поскольку метод будет повторять итерацию коллекции снова, чтобы удалить каждый объект. Не говоря уже о том, что он выделит новый массив для копирования всей коллекции (кошмар для больших коллекций).

8
Titian Cernicova-Dragomir 4 Окт 2018 в 16:24