TimeSpan列表由其他列表的结果计算得出

时间:2015-02-24 20:24:36

标签: c# .net list timespan

我尝试根据其他列表创建列表。该列表看起来像 - {T1, T1, T2, T2, T3, T3}但是整数可能会根据用户输入进行更改。我试图根据旧列表的索引在新列表上分配TimeSpan值,整数将改变结果。例如,如果开始时间为11:00,并且用户给出的时间间隔为5(分钟),则新列表应如下所示 - {11:00, 11:00, 11:05, 11:05, 11:10; 11:10}

这是我目前的职能:

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

我希望新列表与heatlist上的值相对应,具体取决于列表中每个字符串的整数,并在新列表中生成一个时间跨度或时间与之对应。

4 个答案:

答案 0 :(得分: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)跳过&#34; T&#34;在&#34; T123&#34;。
Int32.Parse(t.Substring(1)) - 1创建数字范围0,1,2 ...
* timeGap.Ticks给出给定温度的补偿值 TimeSpan.FromTicks(...) + startTimeSpan)通过添加时间跨度来产生结果时间 .ToString("hh:mm")将生成的时间跨度转换为字符串 .ToList();创建一个新列表。

Ticks是TimeSpan用于在内部存储时间跨度的单位。

答案 1 :(得分: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();

结果:1​​1:00:00,11:00:00,11:05:00,11:05:00,11:15:00,11:25:00。

答案 2 :(得分: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 ());
            }
        }
    }
}

答案 3 :(得分: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中选择一个项目,解析其中的数字并从中减去1(因此T1结果为0T2位于{ {1}}和...),现在将1次结果编号添加到timeGap,并以startTimeSpan格式对其进行格式化。