据我所知,没有官方的方法来实现这个,但是仍然可以使用
System.Reflection
来实现。通过查看
List<T>
的源代码,在
.NET Framework 4.7.2 中,两个重要的属性是
_items
和
_size
。还有一个属性是
_version
,但只有在修改
List<T>
时才会更改。修改操作包括
Add
、
AddRange
、
Remove
等,还包括
Reverse
和
Sort
。因此,假设这与从
IEnumerable<T>
创建列表的操作相同,其中
_version
保持为零。最初的回答。
public static class ListExtensions
{
public static void SetUnderlyingArray<T>(this List<T> list, T[] array)
{
lock (list)
{
SetInternalArray(list, array);
SetInternalArraySize(list, array.Length);
}
}
private static void SetInternalArraySize<T>(this List<T> list, int size)
{
var prop = list.GetType().GetField(
"_size",
BindingFlags.NonPublic | BindingFlags.Instance);
prop.SetValue(list, size);
}
private static void SetInternalArray<T>(this List<T> list, T[] array)
{
var prop = list.GetType().GetField(
"_items",
BindingFlags.NonPublic | BindingFlags.Instance);
prop.SetValue(list, array);
}
}
and then set the underlying array
int[] array = Enumerable.Repeat(1, 1000000).ToArray();
List<int> list = new List<int>();
list.SetUnderlyingArray(array);
注意:此解决方案高度依赖于实现细节,如果List<T>
内部发生变化可能是错误的,但它提供了如何实现的见解。
最初的回答