【问题标题】:Is there a better way to format this string?有没有更好的方法来格式化这个字符串?
【发布时间】:2013-12-12 02:52:00
【问题描述】:

有没有更好的方法来格式化这个字符串?

var Mac = sdr.GetString(0);
string trimMac = Mac.Replace("-", "");
string formatMac = trimMac.Insert(4, ".");
string formatAgain = formatMac.Insert(9, ".");
string dudeWTF = formatAgain.Trim();

我从数据库中提取 mac 地址,然后将它们从 XX-XX-XX-XX-XX-XX 格式化为 XXXX.XXXX.XXXX,然后我使用 StreamWriter 将它们写入文件。 sdr 是SqlDataReader

【问题讨论】:

  • 输入和预期输出是什么?
  • 你格式化它的目的是什么?你期望的输入和输出字符串是什么?
  • 至少,一开始就Trim() 可能不太明智。如果修剪是为了从用户输入中删除过多的空格,那么您将更改两个 . 字符的最终等效输入位置。
  • 考虑使用您评论中的信息更新您的原始问题。这个问题会存在很长时间,现在,它不是很有用(但它可能有用)。

标签: c# asp.net


【解决方案1】:

以字符串开头,例如:String mac="XX-XX-XX-XX-XX-XX";

那么我们就可以这样做了:

String dudeWTF = String.Format("{0}{1}.{2}{3}.{4}{5}", mac.Split('-'));

【讨论】:

  • 这是一种执行操作的新颖方式。我喜欢它如何将拆分结果链接到 string.Format 的 params 参数。做得很好。
  • @ToddBowles:谢谢。有趣的是,我不知道您可以使用数组来做到这一点,直到我在发布之前进行了一些优化时尝试过。
【解决方案2】:
string dudeWTF = Mac.Replace("-", "").Insert(4, ".").Insert(9, ".").Trim();

【讨论】:

  • 基于您在问题中提供的有限信息。
【解决方案3】:

为什么要做一些简单的事情,当你可以使用...

正则表达式

private static readonly string _InnerPattern = "([a-zA-Z0-9]{2})";
private static readonly string _Pattern = string.Format("{0}-{0}-{0}-{0}-{0}-{0}", _InnerPattern);
private static readonly string _ReplacePattern = "$1$2.$3$4.$5$6";
private static readonly Regex _TransformRegex = new Regex(_Pattern, RegexOptions.Compiled);
public static string TransformMacAddressUsingRegex(string input)
{
    return _TransformRegex.Replace(input, _ReplacePattern);
}

上面的表达式为用连字符“-”分隔的每组字符创建一个捕获组,然后使用这些捕获组的内容构造输出字符串。

现在要说坏消息了,它比最初提供的代码慢了几乎 5 倍,而且大约慢了 5 倍。 比@RobertHarvey 的解决方案慢 2.5 倍,而且要复杂得多。这实际上是对我的第一次剪辑的改进,它比最初提供的代码慢 66 倍,比 @RobertHarvey 的解决方案慢 37 倍。

通过在 for 循环中重复转换同一字符串 100 万次并使用 System.Diagnostics.Stopwatch 进行计时来测量计时。

我发布这个答案是因为在某些时候有人会想“为什么不是正则表达式!” (像我一样)因为我在这方面花了太长时间。也许有人会觉得这很有用。

【讨论】:

    猜你喜欢
    • 2011-03-02
    • 1970-01-01
    • 2018-03-30
    • 2019-10-15
    • 2012-12-28
    • 2010-10-31
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多