我在c#中有一个对象的通用列表,并希望克隆列表。列表中的项是可克隆的,但似乎没有做list. clone()的选项。

有什么简单的办法吗?


当前回答

使用AutoMapper(或任何您喜欢的映射库)来克隆是简单的,而且易于维护。

定义映射:

Mapper.CreateMap<YourType, YourType>();

施展魔法吧:

YourTypeList.ConvertAll(Mapper.Map<YourType, YourType>);

其他回答

稍加修改后,你也可以克隆:

public static T DeepClone<T>(T obj)
{
    T objResult;
    using (MemoryStream ms = new MemoryStream())
    {
        BinaryFormatter bf = new BinaryFormatter();
        bf.Serialize(ms, obj);
        ms.Position = 0;
        objResult = (T)bf.Deserialize(ms);
    }
    return objResult;
}

我已经为我自己做了一些扩展,它转换了ICollection的项目,没有实现IClonable

static class CollectionExtensions
{
    public static ICollection<T> Clone<T>(this ICollection<T> listToClone)
    {
        var array = new T[listToClone.Count];
        listToClone.CopyTo(array,0);
        return array.ToList();
    }
}

使用AutoMapper(或任何您喜欢的映射库)来克隆是简单的,而且易于维护。

定义映射:

Mapper.CreateMap<YourType, YourType>();

施展魔法吧:

YourTypeList.ConvertAll(Mapper.Map<YourType, YourType>);

我使用automapper来复制一个对象。我只是设置了一个映射,将一个对象映射到它自己。您可以按照您喜欢的任何方式来完成这个操作。

http://automapper.codeplex.com/

如果你已经参考了Newtonsoft。Json在你的项目和你的对象是可序列化的,你可以总是使用:

List<T> newList = JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(listToCopy))

这可能不是最有效的方法,但除非你做了100次或1000次,否则你甚至不会注意到速度的差异。