C# 创建一个列表,其中元素是同一个对象,但一个属性已更改

C# 创建一个列表,其中元素是同一个对象,但一个属性已更改,c#,C#,我绝望了。关于这个问题,我已经看到了很多答案,但对我来说并不适用 我的方法采用对象类型操作和机器列表。对象操作有一个idMachine。现在,我需要创建一个列表操作,其中有许多项,如列表中的机器数量,并且每个元素都有一个不同的idMachine问题在于每个元素都有相同的idMachine,这是最后一次分配 在我的第一种方法中,我做到了: public void SetOperationCreatedBulk(Operation op, List<Machines> listMachi

我绝望了。关于这个问题,我已经看到了很多答案,但对我来说并不适用

我的方法采用对象类型操作和机器列表。对象操作有一个idMachine。现在,我需要创建一个列表操作,其中有许多项,如列表中的机器数量,并且每个元素都有一个不同的idMachine问题在于每个元素都有相同的idMachine,这是最后一次分配

在我的第一种方法中,我做到了:

public void SetOperationCreatedBulk(Operation op, List<Machines> listMachines){
    List<Operation> listOp = new List<Operation>();
    foreach(var machine in listMachines) {
         op.idMachine = machine.idMachine; // assign the corresponding id
         listOp.Add(op); // add modify op to list
    }
    // do something whith listOp...
}
    
public void SetOperationCreatedBulk(操作op,列出列表机器){
List listOp=新列表();
foreach(listMachines中的var机器){
op.idMachine=machine.idMachine;//分配相应的id
添加(op);//将修改op添加到列表中
}
//做些有利斯托普。。。
}
很快我发现将列表值更改为foreach循环是不可能的,我阅读了where advises use for loop

然后我做了:

public void SetOperationCreatedBulk(Operation op, List<Machines> listMachines){
    List<Operation> listOp = new List<Operation>();
    for (int i = 0; i < listMachines.Count; i++) {
         op.idMachine = listMachines[i].idMachine;
         // listOp[i] = op; // trigger exception, although I do 'List<Operation> listOp = new List<Operation>(listMachines.Count);'
         listOp.Add(op);
    }
    // do something whith listOp...
}
public void SetOperationCreatedBulk(操作op,列出列表机器){
List listOp=新列表();
对于(int i=0;i
我知道问题在于对象操作的引用。我一直在同一家公司工作。我试图在循环中创建一个辅助操作对象,但得到了相同的结果


谢谢您的时间。

如果您希望每个列表项都有自己的
操作
和自己的
idMachine
,那么您需要克隆传入的
操作op

比如:

foreach(var machine in listMachines) 
{
    // Create clone 
    var newOp = new Operation
    {
        SomeProperty = op.SomeProperty,
        // Probably map other properties
    };

    newOp.idMachine = machine.idMachine;
    listOp.Add(newOp);
}

也许你应该更加强调克隆
op
实例的所有属性的重要性。@Thorsten我曾两次提到过它。如果OP想了解更多关于(深度)克隆的知识,有很多问题。我不是来重复现有答案的。;-)此链接提供有关对象上已存在的克隆方法的信息。这可能就足够了,这取决于你想要达到的目标。否则,您可以在希望克隆的对象上实现IClonable,然后使用类似于本文中代码的内容重写克隆方法answer@CodeCaster我没有要求你写一篇关于克隆的文章-只是OP应该明白他需要将所有属性复制到新实例,因此,基本上我指的是一些注释,比如
//在
//Create clone
块中的其他属性。我理解你的意思,但OP已经在为每个列表项创建一个实例而挣扎,这一事实敲响了警钟:-好的,它工作得很好。但现在我不喜欢我的代码。操作有大约20个属性。谢谢!