【问题标题】:how to take all array elements except last element in C#如何在C#中获取除最后一个元素之外的所有数组元素
【发布时间】:2010-07-16 12:33:44
【问题描述】:

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

string[] queries 包含多个字符串。

我想跳过元素中的最后一个字符串并取其余的。我想出了

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

有没有更好的选择?

【问题讨论】:

标签: c# arrays


【解决方案1】:
var remStrings = queries.Take(queries.Length - 1);

无需反转和跳过。只需比数组中的元素少一个即可。

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

【讨论】:

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

对于现在发现此内容的任何人...

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

var remStrings = queries[..^1]

这是

的缩写
var remStrings = queries[0..^1]

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

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

【讨论】:

    【解决方案3】:

    Microsoft 的响应式扩展团队拥有交互式扩展 (NuGet "System.Interactive"),可让您执行此操作:

    var remStrings = queries.SkipLast(1);
    

    【讨论】:

      【解决方案4】:

      为什么不直接拥有:

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

      这将以相同的顺序返回它们。

      如果有必要,请附加 .Reverse() 以交换订单:

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

      【讨论】:

        【解决方案5】:

        This answer from a related post 也值得一提,因为它可以优雅地一次性应用于任何 IEnumerable,而无需事先知道其元素数量。

        【讨论】:

          【解决方案6】:

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

          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();
          • 感谢您的反馈!我的帖子现已被编辑。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-07-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-01-05
          • 1970-01-01
          • 2011-01-24
          相关资源
          最近更新 更多