2009-03-04 5 views
0

Ich habe eine LINQ-Abfrage, die mir eine Liste mit einer Anzahl von untergeordneten Listen alle mit doppelten Werten gibt.Wie behandle ich untergeordnete Listen und neue Objektlisten in C# mit LINQ?

Ich möchte ein QueryResult von diesem erhalten.

Wie kann ich den ersten, den letzten, den höchsten und den niedrigsten doppelten Wert erhalten?

Sollte es ein neues Objekt sein und sollten die neuen Rückgabewerte eine Liste sein?

+0

Bitte geben Sie einen Beispielcode - es ist schwer zu verstehen, was Ihre Situation im Moment ist. –

+0

http://stackoverflow.com/questions/611441/c-linq-grouping-by-specific-timestamp-intervals Ich sollte einen neuen Thread beginnen .. –

+0

numsy, bitte liefern Sie eine klare Probe hier von dem, was Sie versuchen zu tun, ging ich auf den Link, aber ich denke, was du meinst in diesem Beitrag ist verloren mit der Situation, die Sie dort lösen wollten. – eglasius

Antwort

0

Ihre Frage ist ziemlich unklar. Es klingt jedoch so, als hätten Sie eine Reihe von Listenobjekten, die von einer LINQ-Abfrage zurückgegeben werden, und Sie möchten einige Aggregate aus den Werten in allen diesen Unterlisten abrufen. Ich habe noch nie einen Weg gesehen, dies in LINQ zu tun, und ehrlich gesagt glaube ich nicht, dass die Performance so groß sein wird, selbst wenn es einen Weg dafür gäbe. Die Aggregate, nach denen Sie suchen, sind ziemlich einfach manuell zu berechnen, mit einer Schleife. So etwas wie dieses:

double min = 200000000; 
double max = -200000000; 
double first = 0; 
double last = 0; 
bool hasFoundFirst = false; 
foreach (List<double> childList in queryResults) 
{ 
     foreach (double val in childList) 
     { 
      if (!hasFoundFirst) 
      { 
       hasFoundFirst = true; 
       first = val; 
      } 

      if (val < min) 
       min = val; 
      if (val > max) 
       max = val; 
      last = val; 
     } 
} 

So etwas würde Ihnen die Ergebnisse, die Sie auf sehr effiziente Weise suchen. Wenn Sie es effizient codieren können, ist dies in der Regel schneller als LINQ. LINQ ist großartig und ich benutze es für viele Dinge, aber es ist nur ein Werkzeug unter vielen.

1

es ist wahr, dass handcodierte Version ein bisschen schneller sein wird, aber wenn Sie nicht wissen, dass Leistung das Schlüsselproblem Ihrer Anwendung ist, würde ich mich nicht darum kümmern. Die LINQ-Version des Codes würde so aussehen:

IEnumerable<List<double>> queryResults = /*...*/ 

    var aggregates = 
    from ds in queryResults 
    select new { 
     First = ds[0], Last = ds[ds.Count - 1], 
     Lowest = ds.Min(), Highest = ds.Max() }; 

Ich denke, das ist definitiv einfacher zu lesen :-). Wenn das verschachtelte Objekt (ds) nicht vom Typ List ist, müssen Sie anstelle der direkten Indexierung die Erweiterungsmethoden First() und Last() verwenden.

Wenn Sie an der Leistung interessiert sind, können Sie auch Parallel LINQ verwenden, das die Abfrage für mehrere Threads ausführt. Für eine kurze Liste gibt es keinen wirklichen Grund, dies zu tun, aber wenn die Sammlung groß ist, kann es Ihnen eine bessere Leistung geben (besser als eine single-threaded handcodierte Version).

Verwandte Themen