2011-11-28 16 views

risposta

4

Questo darebbe quello che stai cercando:

// Initial Code for Testing 
DataTable dt = new DataTable(); 

dt.Columns.Add("Dates", typeof(DateTime)); 
dt.Rows.Add(new object[] { DateTime.Now }); 
dt.Rows.Add(new object[] { DateTime.Now.AddDays(1) }); 
dt.Rows.Add(new object[] { DateTime.Now.AddDays(2) }); 

Questo è il codice che si desidera utilizzare:

// Actual Code 
DataColumn col = dt.Columns[0]; // Call this the one you have 

DataTable tbl = col.Table; 

var first = tbl.AsEnumerable() 
       .Select(cols => cols.Field<DateTime>(col.ColumnName)) 
       .OrderBy(p => p.Ticks) 
       .FirstOrDefault(); 

var last = tbl.AsEnumerable() 
       .Select(cols => cols.Field<DateTime>(col.ColumnName)) 
       .OrderByDescending(p => p.Ticks) 
       .FirstOrDefault(); 
+1

il tuo approccio sembra migliore :) –

0

Basta prelevare un elenco di DateTime dal DataColumn, Foreach fila nelle vostre DataColumn aggiungono l'elemento corrente nella tua lista di DateTime.

List<DateTime> e utilizzare il metodo Sort quindi ottenere il primo e l'ultimo valore.

A seconda della versione framework, per 2.0 uso sopra, per >=3.5 è possibile utilizzare Max e Min o Con LINQ .OrderByDesc(p => p.X).FirstOrDefault(); sulla tua lista DateTime

+1

Una volta che hai la lista <> potresti anche usare Max() e Min(). Ma penso che si tratti di ottenere la lista. –

+0

@Henk, dove trovi questo metodo? Max() e Min(). –

+0

In Linq-to-Objects –

0
DataTable dt = new DataTable("MyDataTable"); 
DataColumn dc = new DataColumn("DateColumn"); 
dc.DataType = typeof(DateTime); 
dt.Columns.Add(dc); 
for (int i = 0; i <= 5; i++) 
{ 
    DataRow newRow = dt.NewRow(); 
    newRow[0] = DateTime.Now.AddDays(i); 
    dt.Rows.Add(newRow); 
} 

DateTime maxDate = 
    Convert.ToDateTime(
         ((from DataRow dr in dt.Rows 
          orderby Convert.ToDateTime(dr["DateColumn"]) descending 
          select dr).FirstOrDefault()["DateColumn"] 
         ) 
         ); 

DateTime minDate = 
    Convert.ToDateTime(
         ((from DataRow dr in dt.Rows 
          orderby Convert.ToDateTime(dr["DateColumn"]) ascending 
          select dr).FirstOrDefault()["DateColumn"] 
         ) 
         ); 
10
object maxDate = dataTable.Compute("MAX(TheDateColumnName)", null); 
object minDate = dataTable.Compute("MIN(TheDateColumnName)", null); 
2

da aggiungere alla risposta da Kyle, non è più facile da fare solo:

var first = tbl.AsEnumerable() 
       .Max(r => r.Field<DateTime>(col.ColumnName)); 

e

var first = tbl.AsEnumerable() 
       .Min(r => r.Field<DateTime>(col.ColumnName)); 
Problemi correlati