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