-5

我想从 List 中提取数组,而不使用 ToArray() 函数使其生成一个全新的数组。

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

编辑:

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

4

2 回答 2

3

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

例子:

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) 大小的项目可能具有不可预测的值。
于 2013-07-22T20:06:34.320 回答
0

很困惑

我根本不明白你的问题,但如果你想将你的列表放入另一个数组而不使用,.ToArray那么你总是可以foreach在列表上使用 a 并遍历每个元素。(我不确定你为什么要这样做,因为它非常占用 CPU。)

于 2013-07-22T19:38:14.180 回答