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

78
我有一个字符串数组,如下所示。
具体来说,我有一个包含多个字符串的string[] queries。我想要去掉每个元素中的最后一个字符串,只保留前面的内容。我已经想出了以下方法:
var remStrings = queries.Reverse().Skip(1).Take(queries.Length - 1);

有没有更好的替代方案?


可能是 LINQ 如何获取序列中除最后一个元素外的所有元素? 的重复问题。 - Andre Figueiredo
7个回答

130
var remStrings = queries.Take(queries.Length - 1);
无需反转和跳过。只需拿比数组中元素少一个的元素。

如果你真的想要以相反的顺序排列元素,可以在末尾添加.Reverse()

字符串数组没有Take()方法。我错过了什么? - TMC
6
@TMC - Take() 是 IEnumerable 的扩展方法,需要包含 LINQ。 - Justin Niessner
如果你想将结果数组存储在同一个变量中而不是var中:fileData = fileData.Take(fileData.Length - 1).ToArray(); - Iqra.

45

对于现在发现这篇文章的任何人...

随着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的预览版本中可用。


15

微软的反应式扩展团队推出了交互扩展 (NuGet "System.Interactive") 使你能够做到这一点:

var remStrings = queries.SkipLast(1);

12

为什么不直接这样做:

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

如果需要返回相同的顺序,请不要添加任何东西。

如果需要交换顺序,请在后面添加 .Reverse()

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

2

这篇相关帖子中的答案也值得一提,因为它优雅地适用于任何IEnumerable,而不需要事先知道其元素数量,只需一次遍历即可。


0

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

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>(); 完全相同。 - Enigmativity
我明白你想表达的意思,应该是这样的 temp = temp.Take(temp.Length - 1).ToArray(); - ainasiart
感谢您的反馈!我的帖子现在已经被编辑过了。 - FrostyOnion

0
也许这是一个间接的解决方案。然而,可以采用另一种方法而不使用扩展。
// Convert string array to generic list
List<string> queries = new[] { "a", "b", "c", "d", "e" }.ToList();

var lastElement = queries.LastOrDefault();
var takeAllExceptLastElement = queries.Take(queries.LastIndexOf(lastElement));
        
Console.WriteLine(string.Join(",", takeAllExceptLastElement));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接