如何在 C # 中获取除最后一个元素之外的所有数组元素

我有一个这样的字符串数组。

数据超过一个字符串的 string[] queries

我想跳过元素中的最后一个字符串,接受剩下的字符串

var remStrings = queries.Reverse().Skip(1).Take(queries.Length - 1);

还有更好的选择吗?

56623 次浏览
var remStrings = queries.Take(queries.Length - 1);

不需要反转和跳过,只需要比数组中少取一个元素即可。

如果您真的希望元素以相反的顺序排列,那么您可以将 .Reverse()附加到最后。

为什么不干脆:

var remStrings = queries.Take(queries.Length-1);

它们会以同样的顺序返回。

附加 .Reverse()来交换订单,如果这是一个必要的要求:

var remStrings = queries.Take(queries.Length-1).Reverse();

这个来自相关文章 的答案也值得一提,因为它在一次传递中优雅地适用于任何 IEnumerable,而不需要事先知道它的元素数量。

编辑: 您可以有效地将数组替换为相同的数组,减去最后一个元素,代码如下:

queries = queries.Take(queries.Length - 1).ToArray();

如果您想创建一个方法来完成这项工作,那么您可以使用以下方法:

public static string[] TrimLastElement(string[] arr) {
return arr.Take(arr.Length - 1).ToArray();
}

然后像这样在代码中实现它:

queries = TrimLastElement(queries);

微软的反应扩展团队拥有交互式扩展(NuGet“ System. Interactive”) ,可以让你这样做:

var remStrings = queries.SkipLast(1);

如果有人发现了这个。

随着对范围和索引 C # 8和.NET Core 3.0的支持,您可以简单地编写

var remStrings = queries[..^1]

这是

var remStrings = queries[0..^1]

这是通过将 01转换为索引(System.Index)来实现的,^是从序列末尾开始索引的标记(实际上是一个操作符)。然后从这些索引中生成一个范围(System.Range) ,这个范围可以用来访问数组。(见 https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-8#indices-and-ranges)

目前这只适用于.NET Core 3.0的预览版