c#中与复制List变量相关的问题

本文关键字:问题 变量 List 复制 | 更新日期: 2023-09-27 17:51:26

我有一个接受List类型参数的函数,如下所示:

private decimal CalculateIRR(List<AmortizationDepotResult> lstAmortizationDepotResult, decimal carryAmount)
        {
            if (lstAmortizationDepotResult.Count > 0)
            {
                var lstLoanDepots = lstAmortizationDepotResult.ToList();
                lstLoanDepots.First().Payment = carryAmount;
在上面的代码中,我只想改变列表中第一个对象的参数值(Payment)。如果我执行上述代码,carryAmount值在lstAmortizationDepotResultlstLoanDepots中也得到反映。但我不想改变lstAmortizationDepotResult的值,它应该只反映在lstLoanDepots。那么我该如何解决我的问题呢?

谢谢. .

c#中与复制List变量相关的问题

欢迎来到对象的世界,这里的变量不是,而是引用。因此:

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

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

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

我会在你的AmortizationDepotResult类实现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; 
    ...
  }