2015-02-24 82 views
1

我試圖創建一個基於另一個列表的列表。該列表看起來像 - {T1, T1, T2, T2, T3, T3}但是整數可能會根據用戶輸入而改變。我試圖根據舊列表的索引爲新列表分配TimeSpan值,整數將改變結果。例如,如果開始時是作爲11:00,以及由用戶給定的時間間隔爲5(分鐘),新名單應該像 - {11:00, 11:00, 11:05, 11:05, 11:10; 11:10}TimeSpan由其他列表的結果計算的列表

這裏是我當前的功能:

public List<string> TimeGet(List<string> heatList, TimeSpan startTimeSpan, TimeSpan timeGap) 
{ 
    List<string> timeList = new List<string>(); 
    string timeToAddString; 
    for (int i = 0; i < heatList.Count; i++) 
    { 
     if (heatList[i].Contains("1")) 
     { 
      TimeSpan timeToAdd = startTimeSpan; 
      timeToAddString = Convert.ToString(timeToAdd); 
      timeList.Add(timeToAddString); 
     } 
     else 
     { 
      string resultString = Regex.Match(heatList[i], @"\d+").Value; 
      int resultInt = Int32.Parse(resultString); 
      timeGap = TimeSpan.FromMinutes(timeGap.Minutes * resultInt); 
      TimeSpan timeToAdd = startTimeSpan + timeGap; 
      timeToAddString = Convert.ToString(timeToAdd); 
      timeList.Add(timeToAddString); 
     } 
    } 
} 

我希望新列表對應於清單上的值,具體取決於列表中每個字符串所基於的整數,並生成一個時間段或一天中的時間以與新清單中的對應。

+0

使用TimeGet處理時間段解析和格式化是一個錯誤。移出去。通過TimeSpans並返回TimeSpans。有這個功能只能處理TimeSpans。所有這些格式化邏輯掩蓋了真正的邏輯。 – usr 2015-02-24 20:42:12

回答

2

該函數可以做得更簡單,假設heatList中的每個元素都遵循T\d+模式。

public IEnumerable<string> TimeGet(List<string> heatList, TimeSpan startTimeSpan, TimeSpan timeGap) 
{ 
    foreach (var element in heatList) 
    { 
     var input = element.Substring(1); // Takes everything from index 1 = the first digit in the string 
     int multiplier = Int32.Parse(input) - 1; 
     var additionalTime = new TimeSpan(0, (int)(timeGap.Minutes * multiplier), 0); 
     yield return (startTimeSpan + additionalTime).ToString(); 
    } 
} 

使用範例:

string[] sBaseList = { "T1", "T1", "T2", "T2", "T4", "T6" }; 
var sList = sBaseList.ToList(); 
TimeSpan startSpan = new TimeSpan(11, 0, 0); 
TimeSpan gapSpan = new TimeSpan(0, 5, 0); 
var result = TimeGet(sList, startSpan, gapSpan); 
foreach (var s in result) 
    Console.WriteLine(s); 
Console.ReadKey(); 

結果:11:00:00,11:00:00,11時05分00秒,11時05分00秒,11:15:00,11 :25:00。

+0

完美,我用這個,然後把它讀入一個列表來產生我需要的結果。謝謝! – 2015-02-25 19:47:13

+0

@GeorgeBoulton通過「將它讀入列表」,你的意思是你在結果變量上調用'.ToList()',對吧?;) – 2015-02-25 21:15:26

+0

是的,它工作完美,再次感謝 – 2015-02-26 16:45:46

2

使用LINQ

return heatList 
    .Select(t => TimeSpan.FromTicks(
        (Int32.Parse(t.Substring(1))-1) * timeGap.Ticks 
       ) 
       + startTimeSpan).ToString("hh:mm") 
    .ToList(); 

說明:
.Select(t => ...)列舉從heatList每個溫度分配給t的字符串。
t.Substring(1)跳過「T123」中的「T」。
Int32.Parse(t.Substring(1)) - 1創建數字範圍0,1,2 ...
* timeGap.Ticks給出了蜱中給定溫度的偏移量。
TimeSpan.FromTicks(...) + startTimeSpan)通過添加時間片產生最終時間。
.ToString("hh:mm")將生成的時間跨度轉換爲字符串。
.ToList();創建一個新列表。

Ticks是單位TimeSpan用於在內部存儲時間跨度。

1

你可以做到這一點簡單的LINQ聲明

public static List<string> TimeGet(List<string> heatList, TimeSpan startTimeSpan, TimeSpan timeGap) 
{ 
    return heatList 
     .Select(x => 
      startTimeSpan.Add(TimeSpan.FromMinutes(timeGap.Minutes*(int.Parse(x.Substring(1)) - 1))) 
       .ToString(@"hh\:mm")).ToList(); 
} 

這將heatList逐一選擇一個項目,分析它的數量,並從它(所以T1結果是10T2減去1和...),現在將結果編號timeGap乘以startTimeSpan並格式化爲hh:mm格式。

2
namespace Test 
{ 
    using System; 
    using System.Collections.Generic; 
    using System.Text.RegularExpressions; 

    class MainClass 
    { 
     public static void Main (string[] args) 
     { 
      List<string> inputdata = new List<string>(); 
      List<TimeSpan> outputdata = new List<TimeSpan>(); 

      string input = null; 
      while ((input = Console.ReadLine()) != string.Empty) { 
       inputdata.Add (input); 
       TimeSpan t = new TimeSpan (11, 0, 0) + new TimeSpan (0, Convert.ToInt32 (Regex.Match (input, "\\d+").ToString()), 0); 
       outputdata.Add (t); 
      } 

      for (int i = 0; i < inputdata.Count; i++) { 
       Console.WriteLine ("Inputdata: {0}, Outputdata: {1}", inputdata [i], outputdata [i].ToString()); 
      } 
     } 
    } 
}