C# 有没有更好的方法来编写以下方法?

C# 有没有更好的方法来编写以下方法?,c#,.net,regex,datetime,C#,.net,Regex,Datetime,以下方法是否有更好、更优雅的解决方案 预期输入格式: 8 h 13 m 8.13 预期输出格式: 8 h 13 m 8.13 我的代码: private string FormatHours(string value) { //Example: (Input = 10 h 53 m) (Output = 10.53) var timeValues = Regex.Split(value, @"[\shm]", RegexOptions.IgnoreCase).Where

以下方法是否有更好、更优雅的解决方案

预期输入格式:

8 h 13 m
8.13
预期输出格式:

8 h 13 m
8.13
我的代码:

private string FormatHours(string value)
{
    //Example: (Input = 10 h 53 m) (Output = 10.53) 
    var timeValues = Regex.Split(value, @"[\shm]", RegexOptions.IgnoreCase).Where(s => !string.IsNullOrEmpty(s)).ToArray();
    return ((timeValues != null) && (timeValues.Length == 2)) ? string.Format(@"{0:hh}.{1:mm}", timeValues[0], timeValues[1]) : null;
}

是否有理由不使用以下内容

value.Replace(" h ",".").Replace(" m",string.Empty)

我唯一能想到的是,如果timeValues为null,那么调用ToArray将抛出

    private string FormatHours(string value)
    {
        var timeValues = Regex.Split(value, @"[\shm]", RegexOptions.IgnoreCase).Where(s => !string.IsNullOrEmpty(s));

        if (timeValues == null || timeValues.Count() != 2)
            return null;

        string[] arr = timeValues.ToArray();
        return string.Format(@"{0:hh}.{1:mm}", arr[0], arr[1]);
    }
我觉得Regex,斯普利特在这里太过分了。常规的老对手会给你你想要的:

private static string FormatHours(string value)
{
    Match m = Regex.Match(value, @"^(?<hours>\d{1,2}) h (?<minutes>\d{1,2}) m$");
    if (m.Success)
    {
        int hours = int.Parse(m.Groups["hours"].Value);
        int minutes = int.Parse(m.Groups["minutes"].Value);
        if (hours >= 0 && hours < 24 && minutes >= 0 && minutes < 60)
            return string.Concat(hours, ".", minutes);
    }
    return null;   
}
表达方式:

^(\d{1,2}) h (\d{1,2}) m$
代码:


LINQ不太适合你的问题。使用正则表达式的方式与您现在使用的方式略有不同,这就是我要做的:

String FormatHours(String value) {
  var regex = new Regex(@"^(?<hours>\d{1,2})\s*h\s*(?<minutes>\d{1,2})\s*m$");
  var match = regex.Match(value);
  if (match.Success) {
    var hours = Int32.Parse(match.Groups["hours"].Value);
    var minutes = Int32.Parse(match.Groups["minutes"].Value);
    if (hours < 24 && minutes < 60)
      return hours + "." + minutes;
  }
  return null;
}

您可以调整正则表达式以满足您的确切需要。这个函数接受10 h 53 m和10 h53 m之类的字符串。

唯一的原因是它不会在意外输入时返回null。如果需要,那么您可以在调用代码中处理null,或者抛出一个更有意义的异常,并进一步检查方法的有效时数和分钟数不,我说过它不会返回null,它将只返回一个未更改或部分更改的字符串。原始代码还进行某种程度的验证,如果无法解析输入,则返回null。此外,原始代码还将处理8h13m和8h13m等输入。@Guffa我同意。我在描述对原始代码的更改。我想发一封电子邮件,怎么能,我做,用LINQ之类的问题。显然林克是来拯救世界的……好吧,林克已经从冠军中除名了。看起来我所需要的只是在正则表达式中进行一点改进,这也将消除LINQ开销。它还消除了LINQ开销,非常好。@abatischev:oops:Fixed now.\d{1,2}最好排除不切实际的数字