簡體   English   中英

C#一起添加多個文本框的時間

[英]C# Add Times of multiple textboxes together

我正在嘗試將單圈時間加在一起,但是我首先必須檢查文本框中是否有值,然后繼續。 我該怎么做呢? 單圈時間記錄如下: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.TryParseTimeSpan[]使用以下方法:

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因為TimeSpan是一個結構,不能為null 使用TimeSpan.Zero初始化數組中的所有對象。 因此,所有不可解析的時間跨度都將計為零。

我已經使用您格式的一些樣本值成功地對其進行了測試。


如果您有很多這樣的控件,則即使每個控件非常簡單,易讀且可測試,也要為每個控件重復TimeSpan.TryParse(lap1TimeTextBox.Text, out laps[0])可能很TimeSpan.TryParse(lap1TimeTextBox.Text, out laps[0])

如果這些TextBoxes都在同一個容器控件(如Panel或形式),你可以使用LINQ folllowing方式:

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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM