C# 将此字符串转换为分钟数的最佳方法是什么?

C# 将此字符串转换为分钟数的最佳方法是什么?,c#,string,winforms,parsing,combobox,C#,String,Winforms,Parsing,Combobox,我在winforms中有一个组合框,其中包含以下项: 15 min 30 min 1 hr 1 hr 30 min 2 hr 2 hr 30 min etc . . 下面是winforms combobox集合项编辑器的屏幕截图 我需要解析这个字符串并返回一个整数,它表示分钟数。我想看看最优雅的方法(现在我按空间分割,然后计算数组长度,感觉有点不对) 所以解析 2h 30 mins 将返回150,因为您说这是一个组合框,那么您必须解析该值。您的用户也可以输入自己的值 var

我在winforms中有一个组合框,其中包含以下项:

 15 min
 30 min
 1 hr
 1 hr 30 min
 2 hr
 2 hr 30 min
etc . . 
下面是winforms combobox集合项编辑器的屏幕截图

我需要解析这个字符串并返回一个整数,它表示分钟数。我想看看最优雅的方法(现在我按空间分割,然后计算数组长度,感觉有点不对)

所以解析

2h 30 mins
将返回150,因为您说这是一个组合框,那么您必须解析该值。您的用户也可以输入自己的值

var formats = new[] {"h' hr'", "m' min'", "h' hr 'm' min'"};

TimeSpan ts;
if (!TimeSpan.TryParseExact(value, formats, null, out ts))
{
    // raise a validation message to your user.
}

// you said you wanted an integer number of minutes.
var minutes = (int) ts.TotalMinutes;
您可以将示例中显示的任何字符串作为
传递

但是请注意,由于
时间跨度
的工作原理,使用这种方法解析的时间不能超过23小时或59分钟。通过“24小时”或“60分钟”或任何组合都将失败。

这应该可以:

   static int GetAllNumbersFromString(string timeString)
   {
    int min = 0;

    MatchCollection mc=Regex.Matches(timeString, @"\d+");

    if(timeString.Contains("hr") && mc.Count = 1)
    {

          min = mc[0] * 60;

    }
    else
    {

        if(mc.Count > 1)
        {
            min = mc[0] * 60 + mc[1];
        }
        else
        {
            min = mc[0];
        }
    }

    return min;
}

我会使用
字典
,因此根本不需要解析(当有固定的选择时,它工作得很好)我对Delphi的UI控件比.NET更熟悉,因此可能有一种比我在这里做的更好的方法来填充
组合框
,但我相信有人会告诉我是否有,我可以修复它

(代码是Oxygene,但应该很容易翻译成C#或VB.Net。)

方法MainForm.MainForm\u加载(发送方:System.Object;e:System.EventArgs);
变量
KC:Dictionary.KeyCollection;
开始
aItems:=新词典;
添加('15分钟',15分钟);
aItems.Add('30分钟',30分钟);
A.增加(“1小时”,60);
添加('1小时30分钟',90分钟);
aItems.添加('2小时',120);
添加('2小时30分钟',150);
KC:=aItems.key;
对于KC do中的s
comboBox2.项目.添加;
comboBox2.DropDownStyle:=ComboBoxStyle.DropDownList;
结束;
方法MainForm.comboBox2\u SelectedIndexChanged(发送方:System.Object;e:System.EventArgs);
开始
//安全,因为样式是DropDownList。
label1.Text:=aItems[comboBox2.SelectedItem.ToString].ToString();
结束;

为什么不在每个下拉条目中存储分钟数?你所说的分钟数是什么意思?你是在计算还是在添加..请明确你的问题…哪种技术?(asp.net、表单、wpf等)还是没关系?当使用下拉列表时,一件事是文本,另一件事是值。将值设为分钟。然后获取所选项目的值。@Xeano-它的winforms,但我不明白为什么要这样做。我添加了屏幕截图,您将把值放在哪里?这不是下拉列表,这是一个组合框。因此,是的,您需要解析。我更新为使用
TryParseExact
显示,这在您描述的场景中更有用。再编辑一次。由于这是UI,可能最好使用当前区域性(null)而不是不变区域性。这不起作用。解析“1小时”时,返回1(不是60)
method MainForm.MainForm_Load(sender: System.Object; e: System.EventArgs);
var
  KC: Dictionary<String, Int32>.KeyCollection;
begin
  aItems := new Dictionary<String, Int32>;
  aItems.Add('15 min', 15);
  aItems.Add('30 min', 30);
  aItems.Add('1 hr', 60);
  aItems.Add('1 hr 30 min', 90);
  aItems.Add('2 hr', 120);
  aItems.Add('2 hr 30 min', 150);
  KC := aItems.Keys;
  for s in KC do
    comboBox2.Items.Add(s);
  comboBox2.DropDownStyle := ComboBoxStyle.DropDownList;
end;

method MainForm.comboBox2_SelectedIndexChanged(sender: System.Object; e: System.EventArgs);
begin
  // Safe since style is DropDownList. 
  label1.Text := aItems[comboBox2.SelectedItem.ToString].ToString(); 
end;