2015-11-12 12 views
5

Sto implementando il Grafico Telerik con un enorme dato. Le etichette sull'asse x del grafico si sovrappongono. Ho superato questo problema ma non è affidabile a lungo termine.Elenco per restituire valori in intervalli per un campo specifico

Questi sono i Lista campi hanno:

FieldName    DataType 
Date      DATETIME 
DateString    STRING 
Unit      DOUBLE 
Price     DOUBLE 

X-Axis valore dell'etichetta viene da DateString campo

Soluzione ho implementato

  1. Il MIN e MAX Data DateString campo sarà ritorno sempre
  2. Per il resto, il ritorno di quei valori in cui nei giorni feriali è 'Lunedi'

Ecco code-

// Get min and max Date 
DateTime minDate = DateTime.Now; 
DateTime maxDate = DateTime.Now; 
if (dtGas.Rows.Count > 0) 
{ 
    minDate = Convert.ToDateTime(dtGas.Compute("MIN([Date])", "")); 
    maxDate = Convert.ToDateTime(dtGas.Compute("MAX([Date])", "")); 
} 
// Group by 'Date' and 'DateString' | 'SUM' of Unit and 'Price' 
var qGas = from x in dtGas.AsEnumerable() 
      group x by new 
      { 
       Date = x.Field<DateTime>("Date"), 
       DateString = x.Field<string>("DateString") 
      } into egroup 
      let isOne = egroup.Key.Date.DayOfWeek.ToString() == "Monday" 
      select new 
      { 
       Date = egroup.Key.Date, 
       DateString = minDate == egroup.Key.Date ? 
              (
               egroup.Key.DateString 
              ) : 
              (
               maxDate == egroup.Key.Date ? 
               (
                egroup.Key.DateString 
               ) : 
               ( 
                (isOne) ? 
                (
                 egroup.Key.DateString 
                ) : 
                (" ") 
               )            
              ), 
       Unit = egroup.Sum(r => r.Field<double>("Unit")), 
       Price = egroup.Sum(r => r.Field<double>("Price")), 
      }; 

Questa soluzione consente di restituire non tutti i valori, ma alcuni di loro. Quindi evitando sovrapposizioni. Ma in futuro man mano che i dati cresceranno, anche questa soluzione fallirà.

Soluzione bisogno di implementare

Un'idea che stavo pensando, ma non so come implementare è-

  1. Il MIN e MAX Data DateString campo sarà sempre tornare. [Come quello che sto facendo adesso]
  2. Restituisce 8 valori in intervalli da MIN e MAX indipendentemente dal conteggio totale dell'elemento di elenco.
    2.a. Ma se il conteggio delle liste è inferiore o uguale a 8, restituire tutti i valori.

Quindi, ad esempio, se in Elenco I sono presenti 32 valori. Dovrebbe restituirmi un totale di 10 valori nel campo DateString e il resto sarà una stringa vuota.

+1

È difficile proporre una soluzione senza dati di esempio che illustrano dove fallisce – Plutonix

risposta

1

Io suggerirei qualcosa di simile:

public static IList<Stock> GetSome(this IList<Stock> input) 
    { 
     var result = new List<Stock>(); 
     if (input.Count < 8) 
     { 
      return input; 
     } 
     else 
     { 
      var i = 0; 
      for (; i < input.Count; ++i) 
      { 
       if (i % 8 == 0) 
       { 
        result.Add(input[i]); 
       } 
      } 
      if (i % 8 != 0) 
      { 
       result.Add(input.Last()); 
      } 
     } 
     return result; 
    } 

Se le scorte non sono in ordine cronologico, lo chiamerei .Sort() per data su di loro.

Probabilmente aggiungerai il controllo di raccolta nullo e vuoto nel codice.

Problemi correlati