c# - 在添加到列表之前存在检查之间的性能并且在 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();
我想知道这两种方式是最有效的方式。或者有任何其他想法能够将记录添加到列表以避免重复?
解决方案
我会选择第三种方法:HashSet。它有一个构造函数重载,它接受一个IEnumerable
. 此构造函数删除重复项:
如果输入集合包含重复项,则该集合将包含每个唯一元素之一。不会抛出异常。
用法:
List<Product> myProducts = ...;
var setOfProducts = new HashSet<Product>(myProducts);
删除重复项后,没有正确的含义setOfProducts[4]
。
因此 HashSet 不是一个IList<Product>
,而是一个ICollection<Product>
,您可以计算/添加/删除等,您可以对列表进行任何操作。您唯一不能做的就是按索引获取
推荐阅读
- javascript - Javascript:获取每个分号分隔的子字符串的第一个数字子字符串
- c# - 将文件上传到谷歌驱动器
- java - Swing 应用程序窗口未显示更改
- android - 如何使 LinearLayout 中的 TextView 填充剩余空间并被截断
- java - 当我按下开始按钮时,它应该进入下一个活动,但它会进入主屏幕
- rust - Rust 中 Vec 的内存布局是怎样的?
- python - google-coud-storage python list_blob 性能
- activemq - 如何修复错误 activeMQ 端口已在使用中
- c# - C# 从 FTP 下载/读取日志文件
- javascript - 正则表达式:键入的单词匹配开头还是整个单词?