gpt4 book ai didi

c# - 从数组创建列表的效率

转载 作者:太空狗 更新时间:2023-10-29 23:28:26 25 4
gpt4 key购买 nike

我需要从之前已经创建的数组开始创建一个列表,并且只会转换为列表。所以我可以在不制作副本的情况下利用数组到列表中,但是the constructor makes a copy .我什至可以理解这样做的动机。但是,在某些情况下,我可以保证该数组除了创建它的位置之外没有也不会引用它。

有没有办法让这个构造更高效,并在列表内部使用数组?我知道如果我滥用它会产生影响。

最明显的例子是获取 string.Split() 的结果。如果您需要一个列表,您唯一明显的出路就是进行这种转换。现在我不考虑编写一个方法来直接拆分成一个列表。

最佳答案

据我所知,没有官方的方法可以做到这一点,但仍然可以使用 System.Reflection .通过查看 List<T> 的源代码, .NET Framework 4.7.2,两个重要的属性是_items_size .还有_version但只有当你修改 List<T> 时才会改变.修改为Add , AddRange , Remove等,还有ReverseSort .因此,让我们假设这与从 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);
}
}

然后设置底层数组

int[] array = Enumerable.Repeat(1, 1000000).ToArray();
List<int> list = new List<int>();

list.SetUnderlyingArray(array);

注意 此解决方案高度依赖于实现的细节,如果 List<T> 中的某些内容发生变化,则可能是错误的内部结构,但它提供了有关如何实现它的见解。

关于c# - 从数组创建列表的效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54353009/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com