如何在C#中创建候选对象列表?

时间:2015-06-25 12:00:42

标签: c#

我想找到一个最适合某些数据的对象。我这样做的方法是创建一个对象列表,每个对象尝试以不同的方式拟合数据,然后在最后选择最适合数据的对象。 为此,我创建了这些对象的列表,并且我希望它们在开头都是相同的,等于原始对象。我天真地这样做的方式只是:

List <tryObject> tryObjects = new List<tryObject>();

for(int i = 0; i< numberOfDifferentTries; i++)
{
    tryObjects.Add(new truPbject());
    tryObjects[i].dataObject = originalDataObject;
    tryObjects[i].blabla = blablu;
    ...Other assignments
    tryObjects[i].TryToFitTheData();
}
//Select which tryObject in tryObjects[] fits the data best and return it.

但是,我发现这并不是我想要的,因为每个tryObjects[i].dataObject只是对originalDataObject的引用,所以每当我更改每个dataObjects时,所有的变化,加上原来的变化。

我理解在这种情况下我需要的是深层复制品。但是,我这样做的所有方法都是使用IClonable或特殊方法来进行硬拷贝,例如序列化,这需要花费一些精力或者让人头疼。

因此,由于C#没有提供一种简单的方法来实现这一点,我认为它是因为它不是以这种方式解决这个问题而设计的。

所以,我的问题是,按照它要我做事的方式,用C#做我想做的最好的方法是什么?

1 个答案:

答案 0 :(得分:1)

  

因此,由于C#没有提供一种简单的方法,我认为这是因为它不是以这种方式解决这个问题。

那是错的。有一种方法可以解决这个问题:使用ICloneable进行浅层复制或使用序列化等其他方法进行深度克隆。 ICloneable来自框架的开头并且非常常用。

我希望尽可能多地使用ICloneable。它易于编写且易于使用。

这是我一直使用的模板,因为它返回Clone的类型结果,这可能会派上用场:

public class SomeClass : ICloneable
{
    object ICloneable.Clone()
    {
        return this.Clone();
    }

    public SomeClass Clone()
    {
        SomeClass otherInstance = new SomeClass();

        // do the cloning here
        otherInstance.Property = this.Property;
        // end

        return otherInstance;
    }
}