从具有相同值C#的列表中提取间隔

时间:2015-02-16 13:50:33

标签: c# linq list datetime

我有以下课程:

class TimeInterval
    DateTime Start 
    DateTime Finish
    int Value

我有一个列表,其中包含TimeIntervals并带有以下“Value”变量: 0 0 1 2 1 1 3 3 3 3 1

基本上我想在TimeInterval对象中一个接一个地获取值为0的日子,得到天数,它是1(单个实例,顺序为1),得到它的位置为2和等等。

我想知道是否有任何巧妙的获取间隔的方法,其中值是相同的。

示例数据: 该列表将包含以下对象: TimeInterval1(2015年2月2日,2015年2月3日,1日)(StartDate,FinishDate,Value) TimeInterval2(2015年2月3日,2/4 / 2015,1) TimeInterval3(2015年2月4日,2015年2月5日,2日) TimeInterval4(2015年2月5日,2015年2月6日,2日) TimeInterval5(2015年2月6日,2015年2月7日,2日) TimeInterval6(2/7 / 2015,2 / 7 / 2015,1)

例如,这会给我以下间隔: 2015年2月2日 - 2015年2月4日,价值1 2015年2月4日 - 2015年2月7日,价值2 2015年2月7日 - 2015年2月7日,价值1

我有以下代码,但这对最后一项无法正常工作......

public static List<TimeInterval> FindRanges(List<TimeInterval> rp)
    {
        List<TimeInterval> timeintervals = new List<TimeInterval>();
        Boolean stop = false;
        DateTime IntervalStart=DateTime.Now;
        DateTime IntervalFinish=DateTime.Now;
        dynamic Value=0;
        for (int i = 0; i <= rp.Count-1; i++)
        {
            if(stop==false)
            {
                IntervalStart = rp[i].StartDate;
                IntervalFinish = rp[i].StartDate; //we might need to put in the startdate here aswell
                Value = rp[i].Value;
                stop=true;
            }
                if (Convert.ToDouble("0" + rp[i].Value) == Convert.ToDouble("0" + rp[i + 1].Value))
                {
                    Value = rp[i].Value;
                    IntervalFinish = rp[i + 1].StartDate; //we might need to put in the startdate here aswell
                }
                else //we found an interval so we construct one
                {
                    stop = false;
                    if (Convert.ToDouble("0" + Value) != 0)
                    {
                        TimeInterval t = new TimeInterval(IntervalStart, IntervalFinish, Value, i);
                        timeintervals.Add(t);
                    }
                }
            }
        }
        return timeintervals;
    }

1 个答案:

答案 0 :(得分:0)

class Program
{
    static void Main(string[] args)
    {
        var testData = new List<TimeInterval>
                       {
                           new TimeInterval(new DateTime(2015, 02, 02), new DateTime(2015, 03, 02), 1),
                           new TimeInterval(new DateTime(2015, 03, 02), new DateTime(2015, 04, 02), 1),
                           new TimeInterval(new DateTime(2015, 04, 02), new DateTime(2015, 05, 02), 2),
                           new TimeInterval(new DateTime(2015, 05, 02), new DateTime(2015, 06, 02), 2),
                           new TimeInterval(new DateTime(2015, 06, 02), new DateTime(2015, 07, 02), 2),
                           new TimeInterval(new DateTime(2015, 07, 02), new DateTime(2015, 07, 02), 1),
                       };
        var result = FindRanges(testData);

        foreach (var item in result)
        {
            Console.WriteLine("Start: {0} End: {1} Value: {2}",item.StartDate,item.FinishDate,item.Value);
        }

    }

    public static List<TimeInterval> FindRanges(List<TimeInterval> rp)
    {
        List<TimeInterval> timeintervals = new List<TimeInterval>();
        Boolean stop = false;
        DateTime intervalStart = DateTime.Now;
        DateTime intervalFinish = DateTime.Now;
        dynamic value = 0;
        for (int i = 0; i <= rp.Count - 1; i++)
        {
            if (!stop)
            {
                intervalStart = rp[i].StartDate;
                intervalFinish = rp[i].FinishDate; //we might need to put in the startdate here aswell
                value = rp[i].Value;
                stop = true;
            }
            if (i < rp.Count - 1  && Convert.ToDouble("0" + rp[i].Value) == Convert.ToDouble("0" + rp[i + 1].Value))
            {
                //value = rp[i].Value;
                intervalFinish = rp[i+1].FinishDate; //we might need to put in the startdate here aswell
            }
            else //we found an interval so we construct one
            {
                stop = false;
                if (Convert.ToDouble("0" + value) != 0)
                {
                    TimeInterval t = new TimeInterval(intervalStart, intervalFinish, value);
                    timeintervals.Add(t);
                }
            }
        }
        return timeintervals;
    }
}

internal class TimeInterval
{
    public DateTime StartDate { get; set; }
    public DateTime FinishDate { get; set; }
    public int Value { get; set; }

    public TimeInterval(DateTime startIn, DateTime finishIn, int valueIn)
    {
        StartDate = startIn;
        FinishDate = finishIn;
        Value = valueIn;
    }
}