添加多个文本框的时间在一起
本文关键字:时间 在一起 文本 添加 | 更新日期: 2023-09-27 18:02:05
我试图将圈速添加在一起,但我首先必须检查文本框中是否有值,然后继续。我该怎么做呢?单圈时间记录如下:01:29:30
下面是我的代码:try
{
TimeSpan Diff1 = TimeSpan.Parse(lap1TimeTextBox.Text);
TimeSpan Diff2 = TimeSpan.Parse(lap2TimeTextBox.Text);
TimeSpan Diff3 = TimeSpan.Parse(lap3TimeTextBox.Text);
TimeSpan Diff4 = TimeSpan.Parse(lap4imeTextBox.Text);
TimeSpan Diff5 = TimeSpan.Parse(lap5TimeTextBox.Text);
TimeSpan Diff6 = TimeSpan.Parse(lap6TimeTextBox.Text);
TimeSpan Diff7 = TimeSpan.Parse(lap7TimeTextBox.Text);
TimeSpan Diff8 = TimeSpan.Parse(lap8TimeTextBox.Text);
TimeSpan Diff9 = TimeSpan.Parse(lap9TimeTextBox.Text);
TimeSpan Diff10 = TimeSpan.Parse(lap10TimeTextBox.Text);
TimeSpan Total = Diff1 + Diff2 + Diff3 + Diff4 + Diff5 + Diff6 + diff7 + Diff8 + Diff9 + Diff10;
fullTimeTextBox.Text = Total.ToString();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
我会把所有列表框放在一个数组中,并遍历它们,以尽量减少代码的重复:
TextBox[] boxes = { lap1TimeTextBox, lap2TimeTextBox, lap3TimeTextBox }; // etc
// Get boxes with a value
var filledBoxes = boxes.Where(b => !string.IsNullOrWhiteSpace(b.Text));
// Extract timings
var times = filledBoxes.Select(b => TimeSpan.Parse(b.Text));
// Calculate the sum, use ticks, because Sum might not work on TimeSpan directly
var sum = new TimeSpan(times.Sum(time => time.Ticks));
您可以在一行中完成此操作,但这会使代码的可读性降低。
我将为此创建一个方法:
TimeSpan SumAll(params TextBox[] lapTimeTextBoxes)
{
TimeSpan result = new TimeSpan();
TimeSpan temp = new TimeSpan();
for(int i = 1; i < lapTimeTextBoxes.Length; i++)
{
if(TimeSpan.TryParse(lap6TimeTextBox.Text, Temp)) result += temp;
}
return result;
}
使用方式:
fullTimeTextBox.Text = SumAll(lap1TimeTextBox, lap2TimeTextBox, lap3TimeTextBox, lap4TimeTextBox,
lap5TimeTextBox, lap6TimeTextBox, lap7TimeTextBox, lap8TimeTextBox, lap9TimeTextBox, lap10TimeTextBox).ToString();
您可以使用以下方法使用TimeSpan.TryParse
和TimeSpan[]
:
TimeSpan[] laps = new TimeSpan[10];
bool valid = TimeSpan.TryParse(lap1TimeTextBox.Text, out laps[0]);
valid = TimeSpan.TryParse(lap2TimeTextBox.Text, out laps[1]);
// ...
valid = TimeSpan.TryParse(lap10TimeTextBox.Text, out laps[9]);
TimeSpan totalLaps = TimeSpan.Zero;
foreach (TimeSpan lap in laps)
totalLaps = totalLaps + lap;
可以工作,因为TimeSpan
是一个结构体,不能是null
。数组中的所有元素都用TimeSpan.Zero
初始化。因此,所有不可解析的时间跨度将计数为零。
我已经用你的格式的一些样例值成功地测试了它。
如果你有很多这样的控件,那么为每个控件重复TimeSpan.TryParse(lap1TimeTextBox.Text, out laps[0])
可能会变得乏味,即使是非常简单,可读和可测试的代码。
如果这些TextBoxes
都在同一个容器控件中(如Panel
或表单),您可以使用以下LINQ方法:
TimeSpan sumOfAllLapTimes = LapTimePanel.Controls.OfType<TextBox>()
.Where(txt => txt.Name.StartsWith("lap", StringComparison.InvariantCultureIgnoreCase))
.Select(txt => txt.Text.TryGetTimeSpan())
.Where(ts => ts.HasValue)
.Select(ts => ts.Value)
.Sum();
这个查询使用以下两个方便的扩展方法:
public static TimeSpan? TryGetTimeSpan(this string timeSpan, IFormatProvider formatProvider = null)
{
if (timeSpan == null) throw new ArgumentNullException("timeSpan");
TimeSpan ts;
bool success = TimeSpan.TryParse(timeSpan, formatProvider, out ts);
if (success) return ts;
return null;
}
public static TimeSpan Sum(this IEnumerable<TimeSpan> timeSpans)
{
TimeSpan sum = TimeSpan.Zero;
foreach (TimeSpan ts in timeSpans) sum = sum + ts;
return sum;
}
我会这样做:
TextBox[] timeTextBoxes = this.Controls.OfType<TextBox>().Where(txt => txt.Name.StartsWith("lap")).ToArray();
TimeSpan totalTime = new TimeSpan();
foreach (TextBox txt in timeTextBoxes)
{
TimeSpan time;
if (TimeSpan.TryParse(txt.Text, out time))
totalTime = totalTime.Add(time);
}
fullTimeTextBox.Text = totalTime.ToString();