2016-06-22 6 views
-1

ich eine Datentabelle mit den folgenden Daten haben:Gesamt Zeitspanne für jeden Schlüssel in der Tabelle

LINE | SIGN | DATE 
----------------------------------------- 
    1 | 1 | 2015-03-02 11:23:25 
    1 | 1 | 2015-03-02 18:24:03 
    1 | 1 | 2015-03-03 05:38:49 
    1 | 0 | 2015-03-03 08:47:02 
    1 | 1 | 2015-03-03 14:01:31 
    1 | 1 | 2015-03-03 21:11:53 
    1 | 1 | 2015-03-04 09:34:04 
    1 | 0 | 2015-03-04 15:29:27 
    1 | 0 | 2015-03-04 19:28:33 

Die Daten nach Datum geordnet ist, wie Sie sehen, meine Anforderung ist die Gesamtzahl der Minuten zu bekommen für ein Signal. Wie für wie viele Minuten war das Signal 1 und für wie viele Minuten war das Signal 0.

Ich brauche eine LINQ-Abfrage, um die Ergebnisse zu erhalten.

Im Moment denke ich, dass ich eine for-Schleife machen muss und die Anzahl der Minuten hinzufügen muss. Ich weiß nicht, ob dies der einzige Weg ist:

int noOfMinutesFor1 = 0; 
for (int i = 1; i < signalData.Count; i++) 
{ 
    if((signalData[i - 1].SIGN == signalData[i].SIGN == 1) || (signalData[i].SIGN == 1 && signalData[i - 1].SIGN == 0)) 
    { 
     noOfMinutesFor1 += (signalData[i].SIGN - signalData[i - 1].SIGN).TotalMinutes; 
    } 

} 
+0

http://stackoverflow.com/questions/12521366/getting-time-span-between-two-times-in -c – pijemcolu

+0

* Ich brauche eine LINQ-Abfrage, um die Ergebnisse zu erhalten. * Wenn Sie etwas brauchen, fragen Sie uns nicht, aber tun Sie es. –

+0

Ich weiß, wie TimeSpan zu bekommen, ich will den Unterschied zwischen den Zeiten in den Daten oben. – progrAmmar

Antwort

1

Dies ist, was ich tun würde:

Die Idee, alle Termine pro Signal Gruppierung, danach auf die Daten Sortierung in absteigender Reihenfolge, subtrahieren jedes Paar und halten Sie die Offset-Stunden und Minuten (in Minuten) beiseite.

public static void Example() 
{ 
    DataTable dt = new DataTable(); 

    dt.Columns.Add("Signal", typeof(int)); 
    dt.Columns.Add("Date", typeof(DateTime)); 

    dt.Rows.Add(1, DateTime.ParseExact("2015-03-02 11:23:25", "yyyy-MM-dd HH:mm:ss", CultureInfo.CurrentCulture)); 
    dt.Rows.Add(1, DateTime.ParseExact("2015-03-02 18:24:03", "yyyy-MM-dd HH:mm:ss", CultureInfo.CurrentCulture)); 
    dt.Rows.Add(1, DateTime.ParseExact("2015-03-03 05:38:49", "yyyy-MM-dd HH:mm:ss", CultureInfo.CurrentCulture)); 
    dt.Rows.Add(0, DateTime.ParseExact("2015-03-03 08:47:02", "yyyy-MM-dd HH:mm:ss", CultureInfo.CurrentCulture)); 
    dt.Rows.Add(1, DateTime.ParseExact("2015-03-03 14:01:31", "yyyy-MM-dd HH:mm:ss", CultureInfo.CurrentCulture)); 
    dt.Rows.Add(1, DateTime.ParseExact("2015-03-03 21:11:53", "yyyy-MM-dd HH:mm:ss", CultureInfo.CurrentCulture)); 
    dt.Rows.Add(1, DateTime.ParseExact("2015-03-04 09:34:04", "yyyy-MM-dd HH:mm:ss", CultureInfo.CurrentCulture)); 
    dt.Rows.Add(0, DateTime.ParseExact("2015-03-04 15:29:27", "yyyy-MM-dd HH:mm:ss", CultureInfo.CurrentCulture)); 
    dt.Rows.Add(0, DateTime.ParseExact("2015-03-04 19:28:33", "yyyy-MM-dd HH:mm:ss", CultureInfo.CurrentCulture)); 

enter image description here

var groups = dt.AsEnumerable().GroupBy(r => (int)r["Signal"]); 

    foreach (var group in groups) 
    { 
     int groupMinutes = 0; 
     var datesDescending = group.OrderByDescending(g => g["Date"]); 
     for (int i = 0; i < datesDescending.Count(); i += 2) 
     { 
      var date1 = (DateTime)datesDescending.ElementAt(i)["Date"]; 
      if (datesDescending.Count() > i + 1) 
      { 
       var date2 = (DateTime)datesDescending.ElementAt(i + 1)["Date"]; 
       var dateOffset = date1.Subtract(date2); 
       groupMinutes += dateOffset.Hours * 60 + dateOffset.Minutes; 
      } 
      else 
       groupMinutes += date1.Hour * 60 + date1.Minute; 
     } 

     Console.WriteLine("Signal: {0}, total minutes: {1}", group.Key, groupMinutes); 
    } 
} 

Ausgang:

enter image description here

+0

Danke Veverke Ich werde versuchen, Sie wissen zu lassen – progrAmmar

Verwandte Themen