2015-06-01 23 views
-3

我有一个接受的类型列表中的参数功能如下:使List变量的副本在C#中的相关问题

private decimal CalculateIRR(List<AmortizationDepotResult> lstAmortizationDepotResult, decimal carryAmount) 
     { 

      if (lstAmortizationDepotResult.Count > 0) 
      { 
       var lstLoanDepots = lstAmortizationDepotResult.ToList(); 
       lstLoanDepots.First().Payment = carryAmount; 

在上面的代码中,我只是想改变第一对象的参数值(Payment)在列表中。如果我执行上面的代码,carryAmount值得到反映lstAmortizationDepotResult以及lstLoanDepots也。 但我不想更改lstAmortizationDepotResult中的值,它只应反映在lstLoanDepots。 那么我该如何解决我的问题?

谢谢..

+0

那么如何制作副本? –

+0

这不完全是* list *的问题,但列表包含对相同对象的引用。因此,当您执行'lstLoanDepots.First()。Payment = ...'时,您正在更改'lstLoanDepots'的第一个对象,该对象也出现在其他列表中。如果你想让每个列表都有独特的对象,你也需要复制/克隆这些对象。 –

+0

为什么我得到减点?我有没有犯过错误? –

回答

0

Enumerable.ToList创建一个新的列表,但所有的对象包含引用原始对象。如果您想要列表中所有对象的深层副本,请提供适当的构造函数或手动初始化所​​有属性。

if (lstAmortizationDepotResult.Count > 0) 
{ 
    var lstLoanDepots = lstAmortizationDepotResult 
     .Select(x=> new AmortizationDepotResult{ 
      Payment = carryAmount, 
      Property2 = x.Property2, Property3 = x.Property3, .... 
     }) 
     .ToList(); 
    // ... 
1

欢迎的对象,你的变量不是引用的世界。因此:

var a = new Foo(); 
var b = a; 
a.Bar = "Hello!"; 
Console.WriteLine(b.Bar); // output = "Hello!" 

如果你想以这样的方式,他们不共享相同的内存空间中的对象的值复制到另一个相同的对象,你就必须做到这一点明确:

var b = new Foo 
{ 
    Bar = a.Bar, 
    OtherField = a.OtherField 
}; 
0

我实现IClonable接口在AmortizationDepotResult类:

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; 
    ... 
    }