Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何获取泛型类型的副本?_C#_List - Fatal编程技术网

C# 如何获取泛型类型的副本?

C# 如何获取泛型类型的副本?,c#,list,C#,List,针对“以C#为单位设置/扩展列表长度”的问题,建议使用以下代码: public static List<T> EnsureSize<T>(this List<T> list, int size, T value) { if (list == null) throw new ArgumentNullException("list"); if (size < 0) throw new ArgumentOutOfRangeException("

针对“以C#为单位设置/扩展列表长度”的问题,建议使用以下代码:

public static List<T> EnsureSize<T>(this List<T> list, int size, T value)
{
    if (list == null) throw new ArgumentNullException("list");
    if (size < 0) throw new ArgumentOutOfRangeException("size");

    int count = list.Count;
    if (count < size)
    {
        int capacity = list.Capacity;
        if (capacity < size)
            list.Capacity = Math.Max(size, capacity * 2);

        while (count < size)
        {
            list.Add(value);
            ++count;
        }
    }

    return list;
}
publicstaticlist(此列表,int-size,T值)
{
如果(list==null)抛出新的ArgumentNullException(“list”);
如果(大小<0)抛出新ArgumentOutOfRangeException(“大小”);
int count=list.count;
如果(计数<大小)
{
int容量=列表容量;
if(容量<尺寸)
list.Capacity=Math.Max(大小,容量*2);
while(计数<大小)
{
列表。添加(值);
++计数;
}
}
退货清单;
}
通过引用将值添加到列表中如何使用副本来确保列表的大小?


(我尝试使用
Clone()
ICloneable
,但没有成功,因为有些类型,例如
List
返回一个浅拷贝,而我需要一个深拷贝。)

只要你对t一无所知,不管它是可克隆的还是可序列化的,还是一百万种其他复制方式,你将不得不依靠呼叫者来提供这种手段。如果想要任意数量的新T,最简单的版本是在方法签名中请求生成器:

public static List<T> EnsureSize<T>(this List<T> list, int size, Func<T> generator)
{
    if (list == null) throw new ArgumentNullException("list");
    if (size < 0) throw new ArgumentOutOfRangeException("size");

    int count = list.Count;
    if (count < size)
    {
        int capacity = list.Capacity;
        if (capacity < size)
            list.Capacity = Math.Max(size, capacity * 2);

        while (count < size)
        {
            list.Add(generator());
            ++count;
        }
    }

    return list;
}
或者这个:

myList.EnsureSize(42, () => existingItem.Clone());
或者可能是这样:

myList.EnsureSize(42, () => StaticItemFactory.CreateNew());

或者任何其他方法来构造一个新的T。

只要你对T一无所知,不管它是可克隆的还是可序列化的,或者有一百万种其他方法来复制它,你就必须依赖调用者来提供这种方法。如果想要任意数量的新T,最简单的版本是在方法签名中请求生成器:

public static List<T> EnsureSize<T>(this List<T> list, int size, Func<T> generator)
{
    if (list == null) throw new ArgumentNullException("list");
    if (size < 0) throw new ArgumentOutOfRangeException("size");

    int count = list.Count;
    if (count < size)
    {
        int capacity = list.Capacity;
        if (capacity < size)
            list.Capacity = Math.Max(size, capacity * 2);

        while (count < size)
        {
            list.Add(generator());
            ++count;
        }
    }

    return list;
}
或者这个:

myList.EnsureSize(42, () => existingItem.Clone());
或者可能是这样:

myList.EnsureSize(42, () => StaticItemFactory.CreateNew());
或任何其他构造新T的方法。

请说明您如何尝试使用
Clone()
。如果类型不支持深度复制,您希望它做什么?例如,如果用
文件流调用它,您希望它做什么?“on如何通过使用副本来确保列表的大小?粗体部分似乎很重要,但我不明白。如果要创建新引用,请编辑。在任何类型的对象上都无法做到这一点。您需要将
T
限制为实现接口
ICopyable
(todo)的类型。请说明您如何尝试使用
Clone()
。如果类型不支持深度复制,您希望它做什么?例如,如果用
文件流调用它,您希望它做什么?“on如何通过使用副本来确保列表的大小?粗体部分似乎很重要,但我不明白。如果要创建新引用,请编辑。在任何类型的对象上都无法做到这一点。您需要将
T
限制为实现接口
ICopyable
(todo)的类型。