2016-05-05 2 views
0

を望んで誰かがこれを行うには、より効果的な方法にコメントすることができます結果:私は、ユーザのto-doリストを表し作業項目の一般的なリストを持っています。現在、これはソートされ、唯一の期日までにOboutツリービューで表示され、正常に動作しています。

これを更新するには、プライマリとセカンダリの "フィルタ"(期限日、受信日など)をそのツリービューに適用することで、ユーザーが予定リストを並べ替えることができるようにしますツリービューには親のソートと子のソートが表示されます。実際のアイテムはそうのように、孫のように表示されます:

Due Date 
- Received Date 
-- Work Item 
-- Work Item 
- Received Date 
-- Work Item 
Due Date 

...など

Oboutツリービューには、私の知る限り、いくつかの重要な制限があります。

  1. 親ノードが必要子孫の前に作成する
  2. 作成したノードは削除できません
  3. 他のノード(親、兄弟、子供)が存在するかどうかを確認する方法はありません。ノードがサーバー側で重複しているかどうかをプログラムで判断することはできません。

私はいくつかの古いコードを修正していますので、私の例で穏やかになります。私はそれが何をしているのかを明確にするために多くを取らなければならなかった。

public void generateOboutTreeContent() 
{ 
    // Add unique root nodes. 
    switch (primarySort) 
    { 
     [...] 
     case SortOption.ByDueDate: 
      addNodesForDueDates(true); 
      break; 
     [...] 
    } 

    // Then add child nodes for each root node. 
    switch (secondarySort) 
    { 
     [...] 
     case SortOption.ByReceivedDate: 
      addNodesForReceivedDates(); 
      break; 
     [...] 
    } 

    // Finally, add all the actual items as grandchildren. 
    foreach (WorkItem item in WorkQueue) 
    { 
     tree.Add(parentID, item.ID, item.url, false); 
    } 
} 

private void addNodesForDueDates(bool isRootNode = false) 
{ 
    var uniqueNodes = workQueue.GroupBy(i => i.DueDate).Select(group => group.First()).ToList(); 
    foreach (classWorkItem node in uniqueNodes) 
    { 
     var dueDate = node.DueDate; 
     if (isRootNode) 
     { 
      tree.Add("root", dueDate, dueDate , false); 
     } 
     else 
     { 
      tree.Add(parentID, dueDate, dueDate, false); 
     } 
    } 
} 

にはどうすればより効果的に一意の値のために何度も何度もデータセット上で最小限のトラバースと、ジェネリックリストからOboutツリーのルート最初の階層を作成することができますか?

ハードコードされた並べ替えで構造を作成するのは面倒ですが、ユーザー定義の並べ替え(サブクラスやメソッドの爆発なし)をきちんと許す​​方法でこれをコーディングしようとすると、本当に私は困惑してしまいます。私は全くの提案を聞いてみたい!

ありがとうございます。

+0

参照のwikiの記事します。https://en.wikipedia。org/wiki/Tree_sort – jdweng

+0

@jdweng問題は木とソートの両方に関係していますが、実際には問題は解決しません。 – Servy

+0

はい、そうです。質問は次のとおりです。1)「もっと効果的なやり方を誰かがコメントできると思っていますか?」2)「Oboutツリーのルートファースト階層をジェネリックリストからより効果的に(そしてリンク)は、ツリーソートを行う方法を完全に説明しています。この問題は、ソリューションのコーディングを要求しませんでした。私の質問は、Linqが実際より効率的になるかどうかです。 「通常、LinqはLinq以外のソリューションよりも多くのメモリと処理時間を使います。時間のテストが行​​われない限り、わかりません。 – jdweng

答えて

0

あなたはこれらの日付によってデータをソートじゃない、あなたはこれらのデータによりデータをグループ化する(そして、それらのグループをソート)しています。フィールドに基づいてグループ項目に

は、単にGroupByを使用しています。

最初のフィールドでアイテムをグループ化し、2番目のフィールドでグループをグループ化し、グループを注文するために必要に応じて順序句を追加するだけです。

var query = from item in data 
      group item by item.DueDate into dueDateGroup 
      orderby dueDateGroup.Key 
      select from item in dueDateGroup 
        group item by item.RecievedDate into recievedDateGroup 
        orderby recievedDateGroup.Key 
        select recievedDateGroup; 

それとも、あなたがメソッドの構文を使用することを好む場合:ツリービューにそのモデルを翻訳し、適切なモデルにデータを変換したら

var query2 = data.GroupBy(item => item.DueDate) 
    .OrderBy(group => group.Key) 
    .Select(dueDateGroup => 
     dueDateGroup.GroupBy(item => item.RecievedDate) 
      .OrderBy(group => group.Key)); 

は簡単です、あなたは簡単にする必要があり孫を追加するために、各グループを反復し、そのグループの項目を作成し、各項目の子ノードを追加し、そのグループ内の項目を反復処理し、そしてそれらの子供たちのために同じことを行う(グループそのものです)。

+0

ありがとう、私はこれを試してみます。私は、既存のコードをかなりクリーンアップする必要があると思います。 –