C# 如何获取泛型类型的副本?
针对“以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("
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)的类型。