减去列表中相邻的两个值C#

时间:2012-01-12 08:35:48

标签: c#

有一个名为cardReaderHistory的列表。它包含一些有序的时间记录,如下所示,

InTime1
 OutTime1
 InTime2
 OutTime2
 InTime3
 OutTime3
 InTime4
 OutTime4 .....此外..

我需要的是通过(OutTime1 - Intime1)+(OutTime1 - Intime1)计算工作时间.....
 双 我怎么能在C#中做到这一点...... ????

 double hr = ((outTime1 - inTime1)+(OutTime2 - Intime2)+...);  

谢谢.. 可怜的初学者

4 个答案:

答案 0 :(得分:7)

您可以根据索引过滤输入序列,然后压缩两个序列:

var inTimes = source.Where((x, index) => index % 2 == 0);
var outTimes = source.Where((x, index) => index % 2 == 1);

var result = inTimes.Zip(outTimes, (inTime, outTime) => outTime - inTime).Sum();

如果您不需要中间值,您也可以这样做:

var result = source.Select((x, index) => (index % 2 == 0) ? -x : x).Sum();

答案 1 :(得分:1)

假设您的cardReaderHistory列表是双打列表:

List<double> cardReaderHistory = new List<double>(); //fill it somewhere
double result;

for(int i = 0; i < cardReaderHistory.Count(); i++)
{
 if(i%2==0) //If it is equal
  result -= cardReaderHistory[i];
 else //its unequal 
  result += cardReaderHistory[i];
}

您只需循环显示您的值,并根据其是否为偶数进行加减。

答案 2 :(得分:1)

像这样......

 List<double> l = new List<double> { 1, 2, 3, 4, 5, 6, 7, 8 };
 double hr = 0;
 for (int i = 0; i < l.Count; i++)
 {
     hr += i%2 == 0 ? -l[i] : l[i];
 }

答案 3 :(得分:1)

列表似乎包含日期时间而不是小时数似乎是合理的。目前,其他答案都没有处理。这是我的看法。

var cardReaderHistory = new List<DateTime> {DateTime.Now.AddMinutes(-120), DateTime.Now.AddMinutes(-100), DateTime.Now.AddMinutes(-20), DateTime.Now};
var hours = cardReaderHistory.Split(2).Select(h => (h.Last() - h.First()).TotalHours).Sum();

Split是一种扩展方法

static class ExtentionsMethods
{
    public static IEnumerable<IEnumerable<T>> Split<T>(this IEnumerable<T> seq, int size)
    {
        while (seq.Any())
        {
            yield return seq.Take(size);
            seq = seq.Skip(size);
        }
    }
}