2015-11-12 22 views
5

Wprowadzam wykres Telerik z ogromnymi danymi. Etykiety na osi X wykresu pokrywają się. Przezwyciężyłem ten problem, ale nie jest on wiarygodny na dłuższą metę.Lista zwracających wartości w odstępach czasu dla określonego pola

Są Lista pola mają:

FieldName    DataType 
Date      DATETIME 
DateString    STRING 
Unit      DOUBLE 
Price     DOUBLE 

X-Axis wartość etykieta pochodzi od DateString dziedzinie

Rozwiązanie I wdrożone

  1. Date DateString pole MIN i MAX zawsze wracaj.
  2. Dla reszty, powrót tych wartości, gdzie dzień tygodnia „Monday”

Oto 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")), 
      }; 

Takie rozwiązanie przyczynia się do powrotu nie wszystkie wartości, ale niektóre z nich. Dlatego unikaj nakładania się. Ale w przyszłości, gdy dane będą rosły, nawet to rozwiązanie zakończy się niepowodzeniem.

Rozwiązanie muszę wdrożyć

pomysł, że myślałem, ale nie wiem jak zaimplementować IS-

  1. MIN i MAX Data DateString pole zawsze zwróci. [Tak samo jak teraz]
  2. Zwraca 8 wartości w przedziałach od daty MIN i MAX, niezależnie od całkowitej liczby pozycji w liście.
    2.a. Ale jeśli liczba list jest mniejsza niż lub równa 8, zwróć wszystkie wartości.

Na przykład, jeśli na liście mam 32 wartości. Powinno zwrócić mi łącznie 10 wartości w polu DateString, a reszta będzie pustym łańcuchem.

+1

Trudno jest zaproponować rozwiązanie bez przykładowych danych ilustrujących miejsce awarii – Plutonix

Odpowiedz

1

sugeruję coś takiego:

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

Jeżeli akcje nie są w porządku chronologicznym, Nazwałbym .Sort() wg daty na nich.

Prawdopodobnie będziesz chciał dodać puste i sprawdzanie kolekcji w swoim kodzie.

Powiązane problemy