c# - 在不将所有元素复制到新数组的情况下裁剪字符串数组中的第一个元素

标签 c# .net arrays

有一个字符串数组

string[] lines

我想删除第一个元素。所以如果数组有 5 个元素,我想以 4 个结束。

有很多方法可以实现这一点:

  1. 创建一个新的字符串数组,其大小与原始数组相同减一。然后简单地复制所有元素(第一个元素除外)。我不喜欢这样,因为,好吧,你必须创建全新的数组,并且看似重复内存使用(?)

  2. 使用像 List 这样的集合来实现它的方法。但这将是同一个故事:我必须将我的字符串数组转换为列表,然后删除第一个元素,然后将列表转换为字符串数组(因为我需要一个字符串数组,而不是列表)。

  3. System.Array.Resize() 似乎能够“裁剪”数组,这正是我所需要的。但是,它会裁剪“最右边”的元素,而我需要裁剪第一个(最左边的)元素。


我的问题是:是否有一种更简单的方法来消除字符串数组中的第一个元素,最终得到一个大小比原始数组小一个的数组?

最佳答案

我不知道你想用“裁剪”版本做什么,但一个非常便宜的事情是顶部包装 linesArraySegment<> ,像这样:

  var cropped = new ArraySegment<string>(lines, 1, 4);

自 .NET 4.5(自 2012 年起),ArraySegment<>实现了一些接口(interface),因此您可以执行以下操作:

  foreach (var l in cropped)
  {
      // ...
  }

(在 ArraySegment<> 上使用显式接口(interface)实现,迭代变量 l 是强类型的)。​​

请记住,这只是原始数组实例的包装器。如果该数组被修改,这将反射(reflect)在 ArraySegment<> 中。 .没有复制(甚至没有复制)。


如果您需要索引等,请将 ArraySegment<> 的值框起来结构为 IReadOnlyList<>IList<> :

  IReadOnlyList<string> croppedB = new ArraySegment<string>(lines, 1, 4);

或:

  IList<string> croppedC = new ArraySegment<string>(lines, 1, 4);

关于c# - 在不将所有元素复制到新数组的情况下裁剪字符串数组中的第一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26774495/

相关文章:

c# - .Net Fluent Validation 集执行顺序

c# - 从 html 节点返回 null

c# - 命名空间 "XYZ"中不存在名称 "clr-namespace:ABC"

c# - 传递任何函数而不考虑其参数

ios - UITableView 中的 NSUserDefaults 和持久性

javascript - 子数组的最大值

javascript - 如何在 Node js中的foreach之后发送响应?

c# - 长按 Windows Phone 7 中的下拉菜单?

c# - 如何设置向量的长度(在 xna 中)

.net - 使用 WebClient 的 HTTP 2 协议(protocol)