首页 > 解决方案 > 在添加到列表之前存在检查之间的性能并且在 linq 中存在差异

问题描述

在 foreach 循环中,我想将产品添加到列表中,但我希望此列表不包含重复的产品,目前我有两个想法解决了。

1/ 在循环中,在将产品添加到列表之前,我会检查产品是否已经存在于列表中,否则我将其添加到列表中。

foreach (var product in products)
{
    // code logic
    if(!listProduct.Any(x => x.Id == product.Id))
    {
        listProduct.Add(product);
    }
}

2/。在循环中,即使有重复的产品,我也会将所有产品添加到列表中。然后在循环之外,我会使用 Distinct 删除重复记录。

foreach (var product in products)
{
    // code logic
        listProduct.Add(product);
}
listProduct  = listProduct.Distinct().ToList();

我想知道这两种方式是最有效的方式。或者有任何其他想法能够将记录添加到列表以避免重复?

标签: c#performancelinq

解决方案


我会选择第三种方法:HashSet。它有一个构造函数重载,它接受一个IEnumerable. 此构造函数删除重复项:

如果输入集合包含重复项,则该集合将包含每个唯一元素之一。不会抛出异常。

来源:HashSet<T>构造函数

用法:

List<Product> myProducts = ...;
var setOfProducts = new HashSet<Product>(myProducts);

删除重复项后,没有正确的含义setOfProducts[4]

因此 HashSet 不是一个IList<Product>,而是一个ICollection<Product>,您可以计算/添加/删除等,您可以对列表进行任何操作。您唯一不能做的就是按索引获取


推荐阅读