String.Format() - 重新传递参数,但添加更多参数

本文关键字:参数 添加 新传递 Format String | 更新日期: 2023-09-27 18:33:43

我想做这样的事情:

public string GetMessage(params object otherValues[]) {
    return String.Format(this.Message, this.FirstValue, otherValues);
}

因此,我想将参数数组重新传递给String.Format()但添加一个新参数。

最好的

方法是什么,知道我们可以"重建"一个新的对象数组,这似乎并不好。

String.Format() - 重新传递参数,但添加更多参数

public string GetMessage(params object[] otherValues)
{
    return String.Format(this.Message, new[] { this.FirstValue }.Concat(otherValues).ToArray<object>());
}

您可以使用ConcatToArray扩展方法:

public string GetMessage(params object[] otherValues) 
{
    var values = new[] { this.FirstName }.Concat(otherValues).ToArray();
    return String.Format(this.Message, values);
}

如果other参数通常很少,我会使用现有的重载:

public string GetMessage(params object[] otherValues) {
    if (otherValues == null) return string.Format(this.Message, this.FirstValue);
    switch (otherValues.Length)
    {
        case 0:
            return string.Format(this.Message, this.FirstValue);
        case 1:
            return string.Format(this.Message, this.FirstValue, otherValues[0]);
        case 2:
            return string.Format(this.Message, this.FirstValue, otherValues[0], otherValues[1]);
        default:
            return string.Format(this.Message, new[] { this.FirstValue }.Concat(otherValues).ToArray()); 
    }
}

预处理消息

如果您不希望在每个 GetMessage(...( 调用中创建新数组,则可以一次在消息开头插入 FirstValue 中。然后 GetMessage(...( 只对字符串使用 otherValues 参数。格式(...(。

Message 属性在设置 FirstValue 后初始化一次,例如在构造函数或 init 方法中,如下所示:

void InitMessage()
{
    Message = String.Format(Message, FirstValue, "{0}", "{1}", "{2}", "{3}", "{4}");
}

InitMessage 方法使用 FirstValue 初始化 Message 中的第一个索引,并使用 "{index}" 初始化其余索引,即 "{0}"、"{1}"、"{2},...(允许包含比消息索引更多的params元素(。

现在 GetMessage 可以调用 String.Format,而无需任何数组操作,如下所示:

public string GetMessage(params object[] otherValues)
{
  return String.Format(Message, otherValues);
}

例:

假定以下属性值:
this.Message = "First value is '{0}'. Other values are '{1}' and '{2}'."this.FirstValue = "blue" .

初始化消息将消息更改为:
"First value is 'blue'. Other values are '{0}' and '{1}'." .

获取消息调用
GetMessage("green", "red")

结果在
"First value is 'blue'. Other values are 'green' and 'red'." .

另一种混乱的方法是,如果您真的无法为数组创建另一个结构,请使用正则表达式破解格式。

private string FormatEval(Match m)
{
    int val = -1;
    string formatted = m.Value;
    if (int.TryParse(m.Groups["index"].Value, out val))
        formatted = val == 0 ? this.FirstValue : "{" + (val - 1).ToString() + "}";
    return formatted;
}
public string GetMessage(params object[] otherValues)
{
    string format = Regex.Replace(this.Message, @"'{(?<index>'d+)'}", FormatEval);
    return string.Format(format, otherValues);
}

基本上只是解析格式化标记({0}、{1}(等的格式字符串。并降低他们的指数。如果令牌最初{0},请将其替换为 this。名字字符串。

从本质上讲,这样做是手动执行 String.Format 的第一步,然后将生成的字符串传递给 REAL String.Format 方法以完成。

传递离散元素

为了避免在每次 GetMessage 调用中创建数组,您可以通过其离散元素传递 otherValues

public string GetMessage(params object[] otherValues)
{
  return String.Format(Message,
                       FirstValue,
                       GetOrDefault(otherValues, 0),
                       GetOrDefault(otherValues, 1),
                       GetOrDefault(otherValues, 2),
                       GetOrDefault(otherValues, 3),
                       GetOrDefault(otherValues, 4));
}
private object GetOrDefault(object[] otherValues, int index)
{
  if (otherValues == null)
    return null;
  if (index < otherValues.Length)
    return otherValues[index];
  return null;
}