当物体相交时快速设置属性?

时间:2018-04-17 12:32:23

标签: c# performance linq observablecollection

当两个列表中都存在对象

时尝试设置属性时出现性能问题
public class Product
{
    public int Id { get; set; }
}

public class DerivateProduct : Product
{
    public bool isIntersected{ get; set; }
}


public class Storage
{
    public Product stProduct { get; set; }
}


//Approx 10,000 objects
ObservableCollection<DerivateProduct> Products;
//Approx 500 Objects
ObservableCollection<Storage> Storages;

我使用以下代码,它可以工作,但性能非常差(结果大约需要4秒)

Products.Where(cp => Storages.Any(b => b.stProduct.Id == cp.Id))
            .ToList()
            .All(cp => cp.isIntersected = true);

我尝试了以下操作,并且在150毫秒内得到了正确的迭代次数,但是我没有看到如何在具有相同性能的情况下设置isIntersected=true

var intersectedId = Products.Select(cp => cp.Id)
            .Intersect(Storages.Select(b => b.stProduct.Id))
            .ToList();

我真的需要帮助。所有答案将不胜感激。

1 个答案:

答案 0 :(得分:-2)

非常感谢@mjwills它可以正常运行5ms

var stPrIds = Storages.Select(b => b.stProduct.Id).ToArray(); 
foreach (var item in products.Where(cp => stPrIds .Contains(cp.Id)).ToList()) 
{ 
item.IsBiocontrol = true; 
}