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
值在lstAmortizationDepotResult
和lstLoanDepots
中也得到反映。但我不想改变lstAmortizationDepotResult
的值,它应该只反映在lstLoanDepots
。那么我该如何解决我的问题呢?谢谢. .
欢迎来到对象的世界,这里的变量不是值,而是引用。因此:
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;
...
}