c# 深度克隆

爲了防止list引用類型造成干擾,某些時候需要做深度克隆

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;

namespace Common
{
    public class CollectionHelper
    {
        /// <summary>
        /// 按指定數量分組
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="collection"></param>
        /// <param name="size"></param>
        public static Dictionary<int, ICollection<T>> GroupBySize<T>(ICollection<T> t,int size=1000) 
        {
            ICollection<T> collection = (ICollection<T>)t;
            Dictionary<int, ICollection<T>> dic = new Dictionary<int, ICollection<T>>();
            if (collection.Count <= size)
            {
                dic.Add(0, collection);
            }
            else
            {
                for (int i = 0; i <= collection.Count / size; i++)
                {
                    ICollection<T> current = collection.Skip(i * size).Take(size).ToList();
                    dic.Add(i, current);
                }
            }
            return dic;
        }

        /// <summary>
        /// 克隆對象(通過序列化到內存、從內存反序列化回來的方式克隆)
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="source"></param>
        /// <returns></returns>
        public static T Clone<T>(T source)
        {
            //進行序列化的對象必須註明[Serializable]註解
            if (!typeof(T).IsSerializable)
            {
                throw new ArgumentException("The type must be serializable.", "source");
            }

            // Don't serialize a null object, simply return the default for that object
            if (Object.ReferenceEquals(source, null))
            {
                return default(T);
            }

            StreamingContext streamingContext = new StreamingContext(StreamingContextStates.Clone);
            IFormatter formatter = new BinaryFormatter(null, streamingContext);

            T t;
            using (Stream stream = new MemoryStream())
            {
                formatter.Serialize(stream, source);
                stream.Seek(0, SeekOrigin.Begin);
                t = (T)formatter.Deserialize(stream);
                stream.Flush();
                stream.Close();
            }
            return t;
        }

        /// <summary>
        /// 克隆列表
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="origin"></param>
        /// <returns></returns>
        public static List<T> Clone<T>(List<T> origin)
        {
            List<T> target = new List<T>();
            foreach (T t in origin)
            {
                target.Add(Clone(t));
            }
            return target;
        }
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章