【发布时间】:2010-07-16 12:33:44
【问题描述】:
我有一个这样的字符串数组。
string[] queries 包含多个字符串。
我想跳过元素中的最后一个字符串并取其余的。我想出了
var remStrings = queries.Reverse().Skip(1).Take(queries.Length - 1);
有没有更好的选择?
【问题讨论】:
我有一个这样的字符串数组。
string[] queries 包含多个字符串。
我想跳过元素中的最后一个字符串并取其余的。我想出了
var remStrings = queries.Reverse().Skip(1).Take(queries.Length - 1);
有没有更好的选择?
【问题讨论】:
var remStrings = queries.Take(queries.Length - 1);
无需反转和跳过。只需比数组中的元素少一个即可。
如果您真的希望元素以相反的顺序排列,您可以在末尾添加 .Reverse()。
【讨论】:
Take() 方法。我错过了什么?
fileData = fileData.Take(fileData.Length - 1).ToArray();
对于现在发现此内容的任何人...
随着即将推出的对范围和索引 C# 8 和 .NET Core 3.0 的支持,您可以简单地编写
var remStrings = queries[..^1]
这是
的缩写var remStrings = queries[0..^1]
这通过将0 和1 转换为索引(System.Index)来工作,^ 是从序列末尾开始索引的标记(实际上是一个运算符)。然后从这些索引中生成一个范围 (System.Range),然后可以使用它来访问数组。 (见https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-8#indices-and-ranges)
目前这仅适用于 .NET Core 3.0 的预览版
【讨论】:
Microsoft 的响应式扩展团队拥有交互式扩展 (NuGet "System.Interactive"),可让您执行此操作:
var remStrings = queries.SkipLast(1);
【讨论】:
为什么不直接拥有:
var remStrings = queries.Take(queries.Length-1);
这将以相同的顺序返回它们。
如果有必要,请附加 .Reverse() 以交换订单:
var remStrings = queries.Take(queries.Length-1).Reverse();
【讨论】:
This answer from a related post 也值得一提,因为它可以优雅地一次性应用于任何 IEnumerable,而无需事先知道其元素数量。
【讨论】:
已编辑: 您可以使用以下行或代码有效地将您的数组替换为相同的数组减去最后一个元素:
queries = queries.Take(queries.Length - 1).ToArray();
如果您想创建一个为您执行此操作的方法,那么您可以使用以下方法:
public static string[] TrimLastElement(string[] arr) {
return arr.Take(arr.Length - 1).ToArray();
}
并像这样在您的代码中实现它:
queries = TrimLastElement(queries);
【讨论】:
var 类型的变量。 var 只是指示编译器推断类型的关键字。您的代码行与var temp = temp.Take(temp.Length - 1).ToArray<string>(); 相同。
temp = temp.Take(temp.Length - 1).ToArray();