Список C # <object>.RemoveAll () - Как удалить подмножество списка? - PullRequest
7 голосов
/ 02 июля 2011

У меня есть 2 класса feeds_Auto и Product с несколькими подходящими свойствами. Для этой конкретной проблемы AutoID - единственное поле, которое мне нужно использовать.

У меня есть List<FeedsAuto> с несколькими сотнями уникальных записей. У меня есть небольшая List<Product> с 10, 20 уникальными записями. Теперь я хочу удалить все элементы из небольшого списка из большого списка.

Как мне использовать RemoveAll ({лямбда-выражение}) для достижения этой цели? Все примеры, которые я нашел, зависят от общего списка простых типов (строки, целые и т. Д.).

private static int DoInserts(ref List<Model.feeds_Auto> source, ref List<Model.Product> target, Guid companyID)
{
    List<Model.Product> newProductList = new List<Model.Product>();
    List<Model.Product> dropSourceList = new List<Model.Product>();

    using (var db = Helpers.GetProdDB())
    {
        foreach (var src in source)
        {
            var tgt = target.Where(a => a.alternateProductID == src.AutoID && a.LastFeedUpdate < src.DateModified).FirstOrDefault();
            if (tgt == null)
            {
                newProductList.Add(new Model.Product{...});
                dropSourceList.Add(src);
            }
        }
        db.SaveChanges();

        if (dropSourceList.Count > 0)
        {
            source.RemoveAll(????);
        }
    }
}

Сделать это в цикле не сложно:

foreach (var drop in dropSourceList)
{
    source.RemoveAll(a => a.AutoID == drop.AutoID);
}

Для меня просто не имеет смысла зацикливаться на наборе для вызова RemoveAll для одного элемента в каждом проходе.

1 Ответ

14 голосов
/ 02 июля 2011

Вы можете использовать Any для упрощения

source.RemoveAll(a => dropSourceList.Any(b => a.AutoID == b.AutoID));

Вы можете уменьшить цикл, создав сначала HashSet идентификатора:

var toRemove = new HashSet<int>(dropSourceList.ConvertAll(a => a.AutoID));

source.RemoveAll(a => toRemove.Contains(a.AutoID));
...