首页 > 解决方案 > 使用 lambda 根据集合中先前的对象值更新集合中的对象

问题描述

我使用了常规代码,但我可以使用 lambda 或 linq 一次性完成。使用 lambda 根据之前的对象值更新集合中的对象

foreach (var city in frontcities)
{
    if (first== false)
    {
        // previous = city.CitySchduletime.Where(item => item.Schduletimestart == hour).FirstOrDefault().Schduletimestart;
        previous = city.CitySchduletime.Where(item => item.Schduletimestart == hour).FirstOrDefault().Schduletimestop;
        first = true;
    }
    else
    {
        DateTimeOffset ts = DateTimeOffset.FromUnixTimeMilliseconds(previous).AddHours(defaultgap);

        int eta = 600;
        long start = ts.AddSeconds(eta).ToUnixTimeMilliseconds();
        previous = ts.AddSeconds(eta).AddHours(1).ToUnixTimeMilliseconds();
        SchduleTime schduleTime = city.CitySchduletime.Where(item => item.Schduletimestart == hour).FirstOrDefault();
        schduleTime.Schduletimestop = previous;
        schduleTime.Schduletimestart = start;
      //  city.CitySchduletime.Where(item => item.Schduletimestart == hour).FirstOrDefault().Schduletimestart = start;
        //city.CitySchduletime.Where(item => item.Schduletimestart == hour).FirstOrDefault().Schduletimestop = previous;
        //Caculate Eta betwen next city and this city
    }
}      

标签: c#linqlambda

解决方案


我经常定义一个看起来像这样的扩展方法:

public static IEnumerable<(T Previous, T Current)> CurrentAndPrevious<T>(this IEnumerable<T> self)
    {
        using(var iter = self.GetEnumerator())
        {
            if (iter.MoveNext())
            {
                var previous = iter.Current;
                while (iter.MoveNext())
                {
                    yield return (previous, iter.Current);
                    previous = iter.Current;
                }
            }
        }
    }

像这样使用

foreach(var (previous, current) in myList.CurrentAndPrevious())
 {
            ...
 }

推荐阅读