有一个名为cardReaderHistory的列表。它包含一些有序的时间记录,如下所示,
InTime1
OutTime1
InTime2
OutTime2
InTime3
OutTime3
InTime4
OutTime4 .....此外..
我需要的是通过(OutTime1 - Intime1)+(OutTime1 - Intime1)计算工作时间.....
双
我怎么能在C#中做到这一点...... ????
double hr = ((outTime1 - inTime1)+(OutTime2 - Intime2)+...);
谢谢.. 可怜的初学者
答案 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);
}
}
}