c# - List<T> 到 T[] 而不复制

标签 c# arrays list

我有一大堆需要提供给 OpenGL 的值类型。如果这能尽快发生就好了。 我现在正在做的是这样的:

List<Vertex> VList = new List<Vertex>();
... //Add vertices
Vertex[] VArray;
VList.CopyTo(VArray, VList.Length);
GL.SetData(..., VArray);

这个列表很容易就有 10MB 大,所以复制很慢。我可以在不复制的情况下执行此操作,例如以某种方式获取指向 List 内部使用的数组的指针吗?

还是我必须实现自己的 List 类..

编辑:我忘了说我不知道​​要添加到列表中的元素数量。

最佳答案

如果您需要重复访问内部数组,最好将访问器存储为委托(delegate)。

在这个例子中,它是动态方法的委托(delegate)。第一次调用可能不会很快,但后续调用(在相同类型的列表上)会快得多。

public static class ListExtensions
{
    static class ArrayAccessor<T>
    {
        public static Func<List<T>, T[]> Getter;

        static ArrayAccessor()
        {
            var dm = new DynamicMethod("get", MethodAttributes.Static | MethodAttributes.Public, CallingConventions.Standard, typeof(T[]), new Type[] { typeof(List<T>) }, typeof(ArrayAccessor<T>), true);
            var il = dm.GetILGenerator();
            il.Emit(OpCodes.Ldarg_0); // Load List<T> argument
            il.Emit(OpCodes.Ldfld, typeof(List<T>).GetField("_items", BindingFlags.NonPublic | BindingFlags.Instance)); // Replace argument by field
            il.Emit(OpCodes.Ret); // Return field
            Getter = (Func<List<T>, T[]>)dm.CreateDelegate(typeof(Func<List<T>, T[]>));
        }
    }

    public static T[] GetInternalArray<T>(this List<T> list)
    {
        return ArrayAccessor<T>.Getter(list);
    }
}

确保包括:

using System.Reflection;
using System.Reflection.Emit;

关于c# - List<T> 到 T[] 而不复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4972951/

相关文章:

c# - 串口数据丢失 - C#

c - 如何将字符串转换为int并将结果放入数组

java - 如何在 Java 中用数组初始化 vector ?

c# - GroupBy一个属性,把重复的做一个列表

Java8 : Matching and mapping with reference to this

c# - Visual Studio 2015 中用于 Firebird 的 ADO.NET 数据提供程序

c# - 如何在 C# 中查找最新版本的文件名

c# - 无法将 lambda 表达式转换为 int 类型,因为它不是委托(delegate)类型

ios - 比较 1 个 NSarray 和 1 个 NSset 在其中的 1 个中重复计数

jquery - 选择列表的后半部分并应用 css