【问题标题】:Extracting the array from a List without making it generate a new array [closed]从列表中提取数组而不使其生成新数组[关闭]
【发布时间】:2013-07-21 16:18:28
【问题描述】:

我想在不使用 ToArray() 函数的情况下从 List 中提取数组以使其生成一个全新的数组。

我不关心数组中是否有多余的东西等,我只想引用列表使用的数组。

编辑:

对于不理解的人:列表在内部使用数组来存储您的元素。当您执行 ToArray() 时,它实际上会生成一个全新的数组,如果数组很大,这可能会很昂贵。我只想引用列表使用的原始数组。

【问题讨论】:

  • 让我们知道您的进展情况
  • 你为什么要这个?
  • @Tyler 因为我需要将数组的指针指向某个函数,并且出于性能考虑,我不想生成新数组。
  • @BlazArt 这就是为什么你不应该在函数参数中比需要的限制更多。如果该方法的作者将其编写为使用IListIEnumerable(如果他只需要迭代它),那么您将不会处于这个位置。
  • @BlazArt 你真的不想这样做。使用List 的全部意义在于,数组是您无法推理的实现细节。可以对可能破坏尝试执行此操作的代码的类的实现进行更改。如果这确实需要,我建议您编写自己的类型来包装数组并根据需要调整其大小,其中它是公开底层数组的公共 API 的一部分。

标签: c# list collections


【解决方案1】:

您可以使用反射来获取包含内部数组的私有字段。

例子:

List<string> s = new List<string>();
s.Add("1");
s.Add("2");
s.Add("3");
s.Add("4");

FieldInfo info = s.GetType().GetField("_items", BindingFlags.Instance | BindingFlags.NonPublic);
string[] items = (string[])info.GetValue(s);

for (int i =  0; i < s.Count; i++) {
  Console.WriteLine(items[i]);
}

您可能已经意识到这一点,但是如果不包括它,我就无法写出这样的答案:

  • 访问框架类的私有成员是未记录的,并且无法以可靠的方式完成。
  • 这只有在私有字段的名称保持不变时才有效。
  • 您得到的数组仍然被列表使用,因此更改数组项会影响列表。
  • 更改列表将更改数组项,或者使列表放弃数组并用新数组替换它。
  • 数组中超出列表大小 (Count) 的项目可能具有不可预测的值。

【讨论】:

    【解决方案2】:

    很困惑

    我完全不理解您的问题,但如果您想将列表放入另一个数组而不使用 .ToArray,那么您始终可以在列表中使用 foreach 并遍历每个元素。 (我不确定您为什么要这样做,因为它非常占用 CPU。)

    【讨论】:

    • 这和生成一个新数组一样。你只是换了一种方式。
    猜你喜欢
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    相关资源
    最近更新 更多