【发布时间】:2018-11-06 11:19:50
【问题描述】:
我正在使用List<T>,我需要更新列表中的对象属性。
最高效/更快的方法是什么?我知道随着列表的增长,扫描List<T> 的索引会变慢,而且List<T> 并不是进行更新的最有效集合。
那伤心,不如:
- 删除匹配对象然后添加一个新对象?
- 扫描列表索引,直到找到匹配的对象,然后更新对象的属性?
- 如果我有一个集合,让我们使用 IEnumerable,并且我想将该 IEnumerable 更新到列表中,最好的方法是什么。
存根代码示例:
public class Product
{
public int ProductId { get; set; }
public string ProductName { get; set; }
public string Category { get; set; }
}
public class ProductRepository
{
List<Product> product = Product.GetProduct();
public void UpdateProducts(IEnumerable<Product> updatedProduct)
{
}
public void UpdateProduct(Product updatedProduct)
{
}
}
【问题讨论】:
-
这里的“更新项目”是什么意思并不完全清楚,可以您只需用新的产品对象替换现有的产品对象吗?无论哪种方式,如果您无法根据使它们匹配的任何内容直接访问现有对象,那么无论哪种方式,列表的线性性能都将是一个问题。究竟是什么让一个生产对象匹配另一个?产品编号?那你为什么不用字典呢?
-
“最有效/更快的方法?”没有你想的那么清楚,因为这取决于你的上下文。您的列表中有多少对象?您多久添加/删除项目?您多久访问一次项目?话虽如此,这只是选择了适合您的方法,并在遇到严重滞后时考虑性能。
-
由于每个产品都有一个 ID,因此您应该使用字典来提高性能。 Dictionary
其中键是 ProductId -
我不会删除现有对象并添加新对象,如果您最终保留列表并想要替换对象,我会改为用新对象覆盖找到的索引处的元素,这更快,因为列表不必因为删除而在其他项目周围移动。
-
感谢 cmets,这是关于使用 List
而不是其他集合。假设 LIST 有数百万个对象,如何以最快的速度对列表中的现有项目执行数十甚至数百次更新,因为您可以使用 1 个线程进行作业?
标签: c# generic-list