How do I clone a generic list in C#?

前端 未结 26 2505
失恋的感觉
失恋的感觉 2020-11-22 01:27

I have a generic list of objects in C#, and wish to clone the list. The items within the list are cloneable, but there doesn\'t seem to be an option to do list.Clone()

相关标签:
26条回答
  • 2020-11-22 02:09

    Use AutoMapper (or whatever mapping lib you prefer) to clone is simple and a lot maintainable.

    Define your mapping:

    Mapper.CreateMap<YourType, YourType>();
    

    Do the magic:

    YourTypeList.ConvertAll(Mapper.Map<YourType, YourType>);
    
    0 讨论(0)
  • 2020-11-22 02:09

    You could also simply convert the list to an array using ToArray, and then clone the array using Array.Clone(...). Depending on your needs, the methods included in the Array class could meet your needs.

    0 讨论(0)
  • 2020-11-22 02:09

    You can use extension method:

    namespace extension
    {
        public class ext
        {
            public static List<double> clone(this List<double> t)
            {
                List<double> kop = new List<double>();
                int x;
                for (x = 0; x < t.Count; x++)
                {
                    kop.Add(t[x]);
                }
                return kop;
            }
       };
    
    }
    

    You can clone all objects by using their value type members for example, consider this class:

    public class matrix
    {
        public List<List<double>> mat;
        public int rows,cols;
        public matrix clone()
        { 
            // create new object
            matrix copy = new matrix();
            // firstly I can directly copy rows and cols because they are value types
            copy.rows = this.rows;  
            copy.cols = this.cols;
            // but now I can no t directly copy mat because it is not value type so
            int x;
            // I assume I have clone method for List<double>
            for(x=0;x<this.mat.count;x++)
            {
                copy.mat.Add(this.mat[x].clone());
            }
            // then mat is cloned
            return copy; // and copy of original is returned 
        }
    };
    

    Note: if you do any change on copy (or clone) it will not affect the original object.

    0 讨论(0)
  • 2020-11-22 02:10

    If you have already referenced Newtonsoft.Json in your project and your objects are serializeable you could always use:

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

    Possibly not the most efficient way to do it, but unless you're doing it 100s of 1000s of times you may not even notice the speed difference.

    0 讨论(0)
  • 2020-11-22 02:10

    I use automapper to copy an object. I just setup a mapping that maps one object to itself. You can wrap this operation any way you like.

    http://automapper.codeplex.com/

    0 讨论(0)
  • 2020-11-22 02:11

    For a shallow copy, you can instead use the GetRange method of the generic List class.

    List<int> oldList = new List<int>( );
    // Populate oldList...
    
    List<int> newList = oldList.GetRange(0, oldList.Count);
    

    Quoted from: Generics Recipes

    0 讨论(0)
提交回复
热议问题