2012-01-12 23 views
1

有一個名爲cardReaderHistory的列表。包含在有序的方式一定時間記錄如下,對列表C中的相鄰兩個值進行抽象化處理#

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

什麼我需要的是計算工作時間by(OutTime1 - Intime1)+(OutTime1 - Intime1).....
double 我怎麼能在C#中做到這一點...?

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

謝謝。 可憐的初學者

回答

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

假設你的cardReade rHistory列表是雙打的列表:

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

你只是遍歷你的價值觀,並添加或者基於其減去甚至與否。

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]; 
} 
+0

啊貌似我被打一拳。上述解決方案非常相似。 – 2012-01-12 08:51:25

+0

非常感謝 – iJay 2012-01-20 05:04:22

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); 
     } 
    } 
} 
相關問題