2016-08-14 11 views
0

Ich habe ein Problem hier, vor kurzem fand ich dieses Problem mit einem Web-Projekt (erstellt in Sitefinity), wenn ich versuche, eine ganze Liste von Artikeln, die ich im Cache für einen schnelleren Zugriff hinzufügen müssen .C# Double Foreach Optimierung

Ich habe festgestellt, dass einige Genie Entwickler XD verwendet, um die gesamte Liste der Artikel, die zu bestimmten Kategorie, die in der Taxon (einige Eigenschaft von Sitefinity, die diese Art von Kategorie ex erkennt erkennt: Schwangere - Babys - Kinder ... Sie haben die Idee), und müssen einige Suche in einer Artikelsammlung mit dynamischen Inhalten, wo hat die Informationen über die Artikel (Titel, Bilder, Stile, Texte).

Nun, mein Problem ist, dass sie es mit einer doppelten Schleife Forschung mit ForEach getan haben, und mein Chef möchte diese Schleife "optimieren", denn natürlich dauert es zu lange, um diese Schleife zu machen (manchmal kann es sein mehr als 3 oder 4 Minuten, und ja, mein Chef möchte diesen Prozess sofort haben :)).

hier ist der Code:

foreach (HierarchicalTaxon subt in listWeek) 
    { 
     foreach (DynamicContent item in myCollection) 
     { 
      if (item.Organizer.TaxonExists("Category", subt.Id)) 
      { 
       item.Author = subt.Name; 
       //if (articles.Where(art => art.Author.Equals(item.Author)).Count() == 0) 
       articles.Add(item); 
      } 
     } 
    } 

Also muss ich mit dieser Doppel-Loop befassen, die diese 2^n Implementierung hat, meine Frage ist, wie kann ich es tun?!?!?!

Ich dachte über das Hinzufügen einiger LINQ, wie ich in anderen Threads sah, aber es scheint viel zu langsam als dieser tatsächliche Code.

Es sieht so aus, dass myCollection nicht viele Elemente enthält, aber ich bin ziemlich sicher, dass ich diese Art der Optimierung in anderen Sätzen mit derselben Logik in anderen Projekten verwenden muss.

bitte Jungs, ein wenig Unterstützung würde geschätzt werden, ist es möglich, es schneller zu tun ??


Also hier gehen wir, was denkst du Leute, ist das ok?

var data = listWeek.ToDictionary(x => x.Id, x => x.Name); 
var iDdata = data.Keys; 
var nombresData = data.Values; 

foreach (DynamicContent item in myCollection) 
{ 
    if (item.Organizer.TaxonExists("Category", iDdata.First())) 
    { 
     item.Author = nombresData.First(); 
     articlesPrueba1.Add(item); 
    } 
} 

Edit: 16/08/2016 -> Nicht gerade arbeiten, zunächst einmal, ich Probleme habe, wenn ich versuche, die Werte des Wörterbuch zugreifen, so lege ich in separaten Variablen für Id und Name, ich denke, das sollte es tun, aber da bin ich mir nicht sicher.

Aber dann hatte ich dieses Problem, macht nur eine Runde in den Inhalt der Wörterbuchdaten, es scheint offensichtlich, aber ich dachte, dass würde funktionieren, aber leider, tat es nicht.


Ich habe versucht, LINQ zu verwenden:

foreach (HierarchicalTaxon subt in listWeek) 
{ 
    foreach (DynamicContent item in myCollection.Where(item => item.Organizer.TaxonExists("Category", subt.Id))) 
    { 
     item.Author = subt.Name; 
     articlesPrueba2.Add(item); 
     } 
    } 
} 

aber ich habe diese Ausnahme um die Abfrage auf die Datenbank zugreift, verdammt Sitefinity, ich hasse dich ... Aber macht nichts, ich don Es interessiert mich nicht wirklich an LINQ.

immer noch in ernsthaften Optimierungsproblem.

+0

Ich würde mich interessieren zu sehen, was ein Profiler hier sagt. Sie gehen davon aus, dass die verschachtelten Schleifen das Problem sind, aber es gibt viele Möglichkeiten in diesem Code für Ineffizienzen, und es ist schwer, Ihnen eine gute Antwort zu geben, ohne zu sehen, was messbar die ganze Zeit dauert. –

+0

Nun, während ich debugging, meine erste Vermutung war es der Cache, aber dann war ich auf der Suche nach Breakpoints, wo das Projekt mehr Zeit in load Inhalt nahm, und ich habe diese ContentService isoliert, wo die foreach Schleife listWeek und überprüfen muss Meine Collection-Objekte, wo es zu lange gedauert hat, um die Sammlung von Artikeln mit dem richtigen Inhalt zu bekommen, die ich brauche. Aber gut, du hast Recht, es könnte viele andere Probleme geben, ich bin neu in dieser Abteilung, unterstütze seit etwas mehr als 1 Monat, von diesem Projekt, das seit 2013 läuft !!! Ich denke, die Idee, wie groß es ist. – dato000

+0

Verstanden - aber Sie wissen nicht sicher, dass es die verschachtelten Schleifen ist, oder vielleicht die 'TaxonExists' Methode oder sogar' articles.Add' aufrufen. Verwenden Sie einen Profiler, um sicherzustellen, und optimieren Sie dann basierend auf Messungen. Sobald Sie das tun, sollten die folgenden Wörterbuchvorschläge helfen, wenn es sich um die verschachtelten Schleifen handelt. –

Antwort

-1

Sie können den Code optimieren, indem Sie die letzte Woche in eine Dictionary konvertieren, in Form von KeyValue-Paaren aus ID und Name.

var data = listWeek.ToDictionary(x => x.Id, x => x.Name); 

Als nächstes durchlaufen myCollection wie Sie sind jetzt mit einem Verfahren zu tun Kategorie von Wörterbuch zu finden.

+0

Warum verwenden Sie nicht einen 'LINQ JOIN', da Sie LINQ sowieso verwenden? – Rahul

+0

Sicher, LINQ JOIN kann verwendet werden, aber ich glaube, die primäre Optimierung kann nur durch die Reduzierung der beiden Schleifen zu einem kommen. –

+0

Dies setzt voraus, dass das Wörterbuch gespeichert werden kann. Das Wörterbuch jedes Mal neu zu generieren, wenn diese Routine ausgeführt wird, wäre möglicherweise langsamer als nur die verschachtelten Schleifen an erster Stelle. –

0

Dieser Code ist sehr ineffizient, das ist sicher.

Von dem, was ich aus dem Code bekommen kann, möchten Sie im Grunde überprüfen, ob ein dynamisches Content-Element eine Kategorie hat und wenn ja, den Namen dieser Kategorie und weisen Sie es der Author-Eigenschaft zu.

Ein besserer Ansatz wäre, die Sammlung der dynamischen Inhaltselemente (nur einmal) zu wiederholen und zu überprüfen, ob das Element eine Kategorie hat. Wenn dies der Fall ist, suchen Sie das Taxon mit dem Taxonomie-Manager und erhalten Sie seinen Namen/Titel und weisen Sie ihm den dynamischen Inhalt zu.

Auf diese Weise müssen Sie die Sammlung einmal durchlaufen und dann die Taxonomien nur bei Bedarf abfragen.

+0

einfach zu sagen, du sind absolut richtig, aber Sie wissen, mein Chef sagte das, und sagte dann, gehen Sie Ihren Code ... aber das Problem ist, ich weiß nicht, wie es geht, und ich muss alle Sammlungen, Dynamic Content überprüfen und Taxonomien. Sehen Sie mein Problem, ich dachte daran, eine Pause in der inneren Schleife zu machen, aber ich kann das nicht tun, weil ich weniger Artikel in der Artikel-Schleife hinzufügen werde. Schau, ich bin nicht faul, ist nur Ich bin relativ neu in diesem Optimierungskram.Außerdem wissen wir alle, dass Optimierung eine sehr schwierige Aufgabe ist. Außerdem möchte ich klarstellen, dass ich die Eigenschaften von Kategorien und Autoren prüfen muss, um Artikel hinzuzufügen. – dato000

+0

Dammit Ich kann nicht bearbeiten, ich muss sagen, dass Sie Recht haben, nachdem ich den Category Name erhalten habe, muss ich fortfahren, den Namen des Autors dieses Artikels zu vergeben, und dann diesen Artikel zu meiner dritten Liste "articles" hinzufügen. Nun, die Sache ist, ist es möglich, dass über alle zwei Sammlungen "listWeek" und "myCollection" in nur einer Schleife? Ich weiß, dass ich Linq zu diesen Loops hinzufügen kann, um die "if" -Bedingung gleichzeitig in der Runde zu überprüfen, aber ich denke, das ist sogar am schlechtesten in Bezug auf die Leistung. – dato000