C# - 如何替换List <t>中的列表或属性值?

时间:2016-12-16 09:45:21

标签: c# linq list

我已使用BindingList dataSource绑定了一个控件。让我们说:

var dataSource = new List<Model>()
{
   new Model()
   {
      Name = "A",
      CostValue = 60
   },
   new Model()
   {
      Name = "B",
      CostValue = 0
   }
};

每当有属性更改时,它都会触发第三方方法重新计算CostValue并返回CostValues的新列表,如:

var newCostValue = new List<double>(){40,0};

那么用CostValue替换dataSource绑定列表中的CostValue列表的最佳方法是什么,因为dataSource绑定列表中可能有很多模型,有两个{ {1}}循环会非常慢。

我试图找到两个列表之间的区别,但没有运气。似乎通过使用SELECT获取foreach,Except函数只是不起作用,为什么会这样?

costValue

提前致谢!

3 个答案:

答案 0 :(得分:0)

您需要implement IEquatable,因此可以比较项目的相等性。

答案 1 :(得分:0)

如果你也得到这个名字,这可能会对你有用。

dataSource.First(d => d.Name == "B").CostValue = newCostValue[1];

但另一个可能是

dataSource.First(d => d.CostValue == newCostValue[0]).CostValue = newCostValue[1];

答案 2 :(得分:0)

我想提供一个更好的答案,在这里包含更多的线程安全性。 由于项目可以删除,我假设,并假设字段public class Model { public string Name; public double CostValue; } public List<Model> dataSource = new List<Model>() { new Model() { Name = "A", CostValue = 60 }, new Model() { Name = "B", CostValue = 0 } }; /// <summary> /// Updates the original dataSource with the new prices /// </summary> /// <param name="newPrices">Dictionary whereas the Keys are names and values are CostValue of an item</param> public void PriceChange(Dictionary<string, double> newPrices) { foreach (Model model in dataSource) { if (newPrices.ContainsKey(model.Name)) model.CostValue = newPrices[model.Name]; } } 被正确映射到价格:

O(n)

因此,更新将花费n运行时间,而dataSourceList<double>中的项目数,当然更依赖于项目名称本身而不是列表中的索引。

为什么?

因为如果你有另一个线程删除项目或修改它们以使它们的索引发生了变化,那么你会遇到一个严重的问题,你将根据你想要的内容更新不同的项目。

您需要更改的是返回新的价格字典而不是library(survey) data(api) dclus1<-svydesign(id=~dnum, weights=~pw, data=apiclus1, fpc=~fpc) x <- subset( dclus1 , sch.wide == 'Yes' ) svyby(~api00, ~stype, design=x, svytotal)