gpt4 book ai didi

c# - ObservableCollection 添加项目

转载 作者:行者123 更新时间:2023-11-30 21:28:58 25 4
gpt4 key购买 nike

在我的 WPF 应用程序中,我有一个 Functions 的 Observable 集合

private ObservableCollection<Function> functions = new ObservableCollection<Function>();

我为一个按钮编写了一个命令来向集合中添加新功能:在本例中,我添加了一个多项式函数。

public ICommand AddPolyFuncCommand
{
get
{
return new Command(obj =>
{
Function newPolyFunc = new PolyFunction(this.Coefficients);
functions.Add(newPolyFunc);
CalculatePoints();
});
}
}

但是,如果我继续添加更多功能,集合中的所有最新功能都会被我要添加的功能覆盖。例如我有 3 个条目,但功能都是相同的(它们应该不同)。

例如,我创建了第一个函数。之后我想向集合中添加另一个不同的函数。它让我可以正确创建“newPolyFunc”,但如果我在运行时查看 FunctionsCollection,第一个值已经被该函数覆盖。

public ICommand AddTrigoFuncCommand
{
get
{
return new Command(obj =>
{
this.functions.Add(newTrigoFunc);
CalculatePoints();
});
}
}

最佳答案

通过编写 Function newPolyFunc = new PolyFunction(this.Coefficients); 您传递了 Coefficents 的引用,而不是一组新的系数。您可以使用 LINQ 创建系数的深拷贝或创建一个空集并像这样传递它们:

//Create deep copy and pass them
ObservableCollection<double> newCoefficients = new ObservableCollection<double>(Coefficients.Select(c => c));

//Create empty set
ObservableCollection<double> newCoefficients = new ObservableCollection<double>(Enumerable.Repeat(0d, Amount/Grade));

重要提示:当您传递引用时,您传递的是指向实例/对象的指针,而不是克隆/副本。始终注意它是引用类型还是值类型。例如 newTrigoFunc 是一个实例并作为引用传递。所以 this.functions 现在将相同的引用保存了 2 次,而不是保存到不同的实例/对象。当你想添加一个新的对象/实例时,我建议你像这样使用构造函数创建一个新对象/实例

//Add new object/instance
this.functions.Add(new TrigonometricFunctionClass(parameters?));

关于c# - ObservableCollection 添加项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55829826/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com