2016-08-14 12 views
0

私はここで問題を抱えていますが、最近では、高速なアクセスのためにキャッシュに追加する必要がある記事の全リストを取得しようとしているときに、この問題がWebプロジェクト(Sitefinityで作成) 。C#Double Foreachの最適化

私は、Taxonに存在する特定のカテゴリに属する​​記事の全リストを取得するためにいくつかの天才的な開発者XDが使用されていることがわかりました(このカテゴリの種類を認識するsitefinityの一部のプロパティ:Pregnant - Babies - kids ...あなたはアイデアを持っている)、記事(タイトル、イメージ、スタイル、テキスト)についての情報を持っている動的なコンテンツを持つアイテムコレクションでいくつかの検索を行う必要があります。

私の問題は、ForEachを使用した二重ループの研究でそれを行いました。私の上司はそのループを「最適化」したいのですが、そのループを行うのに時間がかかりすぎます。 3〜4分以上、そして私の上司は即座にそのプロセスを望んでいます:))。ここ

はコードです:

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

だから私はこの2^n個の実装があり、この二重のループに対処する必要があり、私の質問は、私はそれを行うことができますどのように、されます?!?!?!

私は他のスレッドで見たようにいくつかのLINQを追加しようと考えていましたが、この実際のコードよりも遅すぎるようです。

myCollectionは長い要素セットを持っていないようですが、他のプロジェクトで同じロジックを持つ他の文でこの種の最適化を使用する必要があります。

お元気ですか、ちょっと戻ってきてしまいますが、早くできるのですか?


ここで私たちは行く、あなたはどう思う?

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

編集:16/08/2016 - >現在動作していない、まず第一に、私は辞書の値にアクセスしようとしているとき、私はトラブルを得たので、私はIDの別々の変数に添付して、名前、私はそれを行う必要があると思うが、私はそれについては分かりません。

しかし、私はこの問題を抱えていました。辞書データの内容を一周しているだけですが、それは明らかですが、うまくいくと思っていましたが、残念ながらそれはありませんでした。


私はLINQを使用しようとしていた。

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

を私はデータベースにアクセスしていないクエリについては、この例外が発生しましたが、Sitefinityあなたのいまいましい、私は用事あなたを憎む...しかし、私はドン本当にLINQについて気にしない。

まだ深刻な最適化問題があります。

+0

私はここでプロファイラが何を言っているのか興味があります。ネストされたループが問題であると仮定していますが、このコードには非効率性についての多くの機会があり、常に測定可能なものを見ずに良い答えを出すのは難しいです。 –

+0

私はデバッグしていましたが、最初はキャッシュだったと思いますが、プロジェクトがロード・コンテンツにもっと時間を要していたブレーク・ポイントを探していました。このcontentServiceを隔離しました。foreachループはlistWeekと私が必要とする適切な内容の記事のコレクションを手に入れるのに時間がかかりすぎた、私のコレクションオブジェクト。でも、このプロジェクトでは2013年以来、わずか1ヶ月後からサポートをしています。私はそれがどれほど大きいかという考えを持っていると思います。 – dato000

+0

しかし、ネストされたループか、あるいは 'TaxonExists'メソッドか、' articles.Add'を呼んでいるかどうかは分かりません。プロファイラーを使用して確認し、測定値に基づいて最適化します。いったんこれを行うと、ネストされたループであると判明した場合、以下の辞書の提案が役立ちます。 –

答えて

-1

先週をDictionaryに変換して、IdとNameのKeyValueペアの形式でコードを最適化することができます。あなたは辞書からカテゴリーを見つけるために、この方法で、今やっているよう

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

次に、myCollectionを反復します。

+0

とにかくLINQを使っているので、なぜ 'LINQ JOIN'を使わないのですか? – Rahul

+0

もちろん、LINQ JOINを使用することもできますが、2つのループを1つに減らすだけで、プライマリの最適化を行うことができます。 –

+0

これは、辞書を保存できることを前提としています。このルーチンが実行されるたびに辞書を再生成することは、最初にネストされたループを実行するよりも遅くなる可能性があります。 –

0

このコードは非常に非効率ですが、それは確かです。

動的コンテンツアイテムにカテゴリがあるかどうかをチェックしたい場合は、そのカテゴリの名前を取得してAuthorプロパティに割り当てます。

より良いアプローチは、動的コンテンツアイテムのコレクションを1回だけループして、アイテムにカテゴリがあるかどうかを確認することです。その場合は、Taxonomy Managerを使用して分類群を見つけ、その名前/タイトルを取得し、動的コンテンツに割り当てます。

この方法では、コレクションを1回ループしてから、必要なときにのみ分類をクエリする必要があります。

+0

私の上司が言った、そして言った、あなたのコードを行う...しかし、問題は、私はそれを行う方法がわからない、私はすべてのコレクション、動的コンテンツをチェックする必要があります私の問題を参照してください、私は内側のループに休憩を入れようと考えていましたが、私はそれを行うことはできません。記事のループに追加するアイテムが少なくなるからです。私はこの最適化のもので相対的な新しいです。さらに、最適化は非常に難しい作業です。また、私は記事を追加するためにカテゴリと著者のプロパティをチェックする必要があることを明確にしたいと思います。 – dato000

+0

Dammit私は編集できません、私はあなたが正しいと言う必要があります、カテゴリ名を取得した後、その記事の著者の名前をasignに進み、そのアイテムを第3のリスト "記事"に追加する必要があります。まあ、事は、2つのコレクションの "listWeek"と "myCollection"を1つのループでチェックすることは可能ですか?私はラウンドで同時にif条件をチェックするためにLinqにこれらのループを追加できることを知っていますが、それはパフォーマンスの面でも最悪のことだと思います。 – dato000