【问题标题】:C# List<object>.RemoveAll() - How to remove a subset of the list?C# List<object>.RemoveAll() - 如何删除列表的子集?
【发布时间】:2011-09-27 00:58:21
【问题描述】:

我有 2 个类 feeds_AutoProduct 具有多个匹配属性。对于这个特殊问题,AutoID 是我需要使用的唯一字段。

我有一个List&lt;FeedsAuto&gt;,其中包含数百个唯一条目。我有一个小的 List&lt;Product&gt; 有 10、20 个 unique 条目。我现在想从大列表中删除小列表中的所有项目。

如何使用 RemoveAll({lambda 表达式}) 来完成此操作?我发现的所有示例都依赖于简单类型(字符串、整数等)的通用列表。

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 是没有意义的。

【问题讨论】:

    标签: c# generics collections lambda


    【解决方案1】:

    您可以使用Any 来简化

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

    您可以通过创建 ID 的第一个 HashSet 来减少循环:

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

    【讨论】:

      猜你喜欢
      • 2011-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-22
      • 2019-04-06
      相关资源
      最近更新 更多