C# 与在C中复制列表变量相关的问题#
我有一个函数,它接受一个列表类型的参数,如下所示:C# 与在C中复制列表变量相关的问题#,c#,list,generics,C#,List,Generics,我有一个函数,它接受一个列表类型的参数,如下所示: private decimal CalculateIRR(List<AmortizationDepotResult> lstAmortizationDepotResult, decimal carryAmount) { if (lstAmortizationDepotResult.Count > 0) { var lstLoanD
private decimal CalculateIRR(List<AmortizationDepotResult> lstAmortizationDepotResult, decimal carryAmount)
{
if (lstAmortizationDepotResult.Count > 0)
{
var lstLoanDepots = lstAmortizationDepotResult.ToList();
lstLoanDepots.First().Payment = carryAmount;
private decimal CalculateIRR(列表lstamoritationdepotresult,十进制carryAmount)
{
如果(lstAmortizationDepotResult.Count>0)
{
var lstLoanDepots=lstAmortizationDepotResult.ToList();
lstLoanDepots.First().Payment=carryAmount;
在上面的代码中,我只想更改列表中第一个对象的参数值(Payment)
。如果执行上述代码,carryAmount
值将反映在lstamorizationdepotresult
以及lstLoanDepots
中。
但是我不想更改lstamorizationdepotresult
中的值,它应该只反映在lstLoanDepots
中。
那么我该如何解决我的问题呢
谢谢..
可枚举。ToList
创建了一个新列表,但包含的所有对象都引用了原始对象。如果需要列表中所有对象的深度副本,请提供适当的构造函数或手动初始化所有属性
if (lstAmortizationDepotResult.Count > 0)
{
var lstLoanDepots = lstAmortizationDepotResult
.Select(x=> new AmortizationDepotResult{
Payment = carryAmount,
Property2 = x.Property2, Property3 = x.Property3, ....
})
.ToList();
// ...
欢迎来到对象世界,这里的变量不是值而是引用。因此: 如果要将一个对象的值复制到另一个相同的对象,使它们不共享相同的内存空间,则必须显式执行此操作:
var b = new Foo
{
Bar = a.Bar,
OtherField = a.OtherField
};
我将在您的
amorizationdepotresult
类中实现IClonable
接口:
public class AmortizationDepotResult ...
IClonable {
...
Object IClonable.Clone() {
return Clone();
}
public AmortizationDepotResult Clone() {
AmortizationDepotResult result = new AmortizationDepotResult();
...
result.Payment = Payment;
...
return result;
}
}
所以为了有一个深度拷贝,你可以
private decimal CalculateIRR(List<AmortizationDepotResult> lstAmortizationDepotResult, decimal carryAmount) {
if (lstAmortizationDepotResult.Count > 0) {
var lstLoanDepots = lstAmortizationDepotResult
.Select(item => item.Clone())
.ToList();
lstLoanDepots[0].Payment = carryAmount;
...
}
private decimal CalculateIRR(列表lstamoritationdepotresult,十进制carryAmount){
如果(lstAmortizationDepotResult.Count>0){
var lstLoanDepots=lstAmortizationDepotResult
.Select(item=>item.Clone())
.ToList();
lstLoanDepots[0]。付款=结转金额;
...
}
那么如何制作副本?列表没有问题,但列表包含对相同对象的引用。当您执行lstLoanDepots.First()时也是如此.Payment=…
您正在更改lstLoanDepots
的第一个对象,该对象也存在于其他列表中。如果您希望每个列表都有唯一的对象,则还需要复制/克隆这些对象。为什么我会得到负分?我是否犯了任何错误?
private decimal CalculateIRR(List<AmortizationDepotResult> lstAmortizationDepotResult, decimal carryAmount) {
if (lstAmortizationDepotResult.Count > 0) {
var lstLoanDepots = lstAmortizationDepotResult
.Select(item => item.Clone())
.ToList();
lstLoanDepots[0].Payment = carryAmount;
...
}