【问题标题】:How to add value to each item in array inline style如何为数组内联样式中的每个项目添加值
【发布时间】:2014-12-03 11:49:30
【问题描述】:

假设我有一个数组

string[] arr = new string[] {"1","2","3"};

我想在值的末尾添加一个字符串,如下所示:

arr.appendToEnd(" Test");

return arr; // returns {"1 Test","2 Test","3 Test"}

我想知道是否有内置的东西可以做到这一点,而不必构建我自己的扩展方法。

【问题讨论】:

标签: c#


【解决方案1】:

没有内置任何东西。您可以使用 LINQ 轻松创建 new 数组:

arr = arr.Select(x => x + " Test").ToArray();

... 但这不会修改原始数组。如果其他任何东西都引用了原始数组,他们将看不到更改。通常这实际上是 IMO 的一件好事,但有时您可能想要修改现有的集合。

为此,您可以编写自己的通用方法来修改现有数组(或任何其他IList<T> 实现):

public static void ModifyAll<T>(this IList<T> source, Func<T, T> modification)
{
    // TODO: Argument validation
    for (int i = 0; i < source.Count; i++)
    {
        source[i] = modification(source[i]);
    }
}

那么你可以使用:

arr.ModifyAll(x => x + " Test");

我肯定会使用它而不是编写特定于字符串连接的扩展方法。

【讨论】:

  • 嘿,谢谢。在使用 .ToArray() 之前,arr 是什么? (好奇)
  • @RealWorld:我不确定你的意思。 arr.Select(x =&gt; x + " Test") 返回一个惰性求值的迭代器,它会在被询问时产生投影结果。它根本不会修改arr
【解决方案2】:

如果“内置”是指函数appendToEnd 存在,则不存在。

然而,它很容易做到:

arr = arr.Select(s => s + " Test").ToArray();

【讨论】:

  • 那不会修改数组。
  • @JonSkeet 正确,现已修复。
  • 那仍然没有做OP要求的,即修改原始数组。差异可能很重要。我在回答中提供了一个示例。
  • @JonSkeet 毫无疑问,它将创建一个新数组,这当然很重要。 +1 对您更完整的答案;我认为 OP 想要一个单行,这就是我没有建议循环的原因。
猜你喜欢
  • 1970-01-01
  • 2018-10-15
  • 2022-01-21
  • 2018-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
相关资源
最近更新 更多