2011-01-07 27 views
0

我有一個查看訂單作爲關鍵字的字典,該值是包含數據的對象。查看訂單,類型,testName,testGUSelected。數據看起來像字典soted使用linq查找包含在字典中的數據的小計總計和總計

10, [10, A, English1, No]; 
12, [12, B, English1, Yes]; 
14, [14, C, English1, No]; 
16, [16, C, English1, No]; 
20, [20, B, English1, No]; 
22, [22, C, English1, No]; 
24 [24, C English1, No]; 
40 [40, A, English1, No]; 
42, [42, B, English1, No]; 
45, [45, C, English1, Yes]; 

我需要計算數量「C的屬於它的父‘B’,同時也還計數」 B的屬於他們的父母‘A’。 確定哪些C屬於特定'B'的方式是C在B之後,它們的視圖順序大於父'B',並且子列表一直持續到您擊中字典中的下一個B爲止。 確定哪些B屬於特定「A」的方式是B位於「A」之後並且其視圖順序大於父項「A」,並且子列表一直持續到您點擊字典中的下一個A 。

我需要計算'C'屬於它的父'B'的數量,並檢查屬於父'B'的所有C是否都標記爲'是',然後更新父'B'的值'從'否'到'是'。孩子'B'和父母'A'需要進行相同的計算和更新。

任何幫助/建議,非常感謝。 感謝您的所有幫助,提前。

+0

你可以使用不同的數據結構嗎?最好是一棵樹。 – juharr 2011-01-07 18:55:42

回答

0

這裏有很多需要改進的地方,但是你想要做的就是將你的數據分類並存入樹形結構。然後循環遍歷子節點,查看它們的值是否設置爲Yes,並調整當前節點。

class Program 
{ 
    static void Main(string[] args) 
    { 
     //Load your data 
     Dictionary<int, Data> data = new Dictionary<int, Data>(10); 
     data.Add(10, new Data(10, Data.ViewType.A, "English1", Data.Selected.No)); 
     data.Add(12, new Data(12, Data.ViewType.B, "English1", Data.Selected.Yes)); 
     data.Add(14, new Data(14, Data.ViewType.C, "English1", Data.Selected.No)); 
     data.Add(16, new Data(16, Data.ViewType.C, "English1", Data.Selected.No)); 
     data.Add(20, new Data(20, Data.ViewType.B, "English1", Data.Selected.No)); 
     data.Add(22, new Data(22, Data.ViewType.C, "English1", Data.Selected.No)); 
     data.Add(24, new Data(24, Data.ViewType.C, "English1", Data.Selected.No)); 
     data.Add(40, new Data(40, Data.ViewType.A, "English1", Data.Selected.No)); 
     data.Add(42, new Data(42, Data.ViewType.B, "English1", Data.Selected.No)); 
     data.Add(45, new Data(45, Data.ViewType.C, "English1", Data.Selected.Yes)); 

     List<int> sortedViewOrder = data.Keys.ToList<int>(); 
     sortedViewOrder.Sort(); 
     Tree dataTree = new Tree(new TreeNode(new Data(0, Data.ViewType.A, "English1", Data.Selected.No))); 
     //Assuming all your data is correctly ordered and A always has at least one B below it, B always has at least one C below it. 
     for (int i = 0; i < sortedViewOrder.Count;) 
     { 
      TreeNode subTreeA = new TreeNode(data[sortedViewOrder[i]]); 
      i++; 
      while (i < data.Count && data[sortedViewOrder[i]].Type == Data.ViewType.B) 
      { 
       TreeNode subTreeB = new TreeNode(data[sortedViewOrder[i]]); 
       i++; 
       while (i < data.Count && data[sortedViewOrder[i]].Type == Data.ViewType.C) 
       { 
        subTreeB.AddChild(new TreeNode(data[sortedViewOrder[i]])); 
        i++; 
       } 
       subTreeA.AddChild(subTreeB); 
      } 
      dataTree.Root.AddChild(subTreeA); 
     } 
     foreach (TreeNode childA in dataTree.Root.Children) 
     { 
      foreach (TreeNode childB in childA.Children) 
      { 
       if (childB.AllChildrenTestGUSelectedYes()) 
       { 
        childB.Data.TestGUSelected = Data.Selected.Yes; 
       } 
      } 
      if (childA.AllChildrenTestGUSelectedYes()) 
      { 
       childA.Data.TestGUSelected = Data.Selected.Yes; 
      } 
     } 
     foreach (TreeNode childA in dataTree.Root.Children) 
     { 
      Console.WriteLine(childA.Data.ToString()); 
      foreach (TreeNode childB in childA.Children) 
      { 
       Console.WriteLine(childB.Data.ToString()); 
       foreach (TreeNode childC in childB.Children) 
       { 
        Console.WriteLine(childC.Data.ToString()); 
       } 
      } 
     } 
     Console.ReadLine(); 
    } 

    public class Tree 
    { 
     public TreeNode Root { get; private set; } 
     public Tree(TreeNode root) 
     { 
      Root = root; 
     } 
    } 

    public class TreeNode 
    { 
     public Data Data { get; private set; } 
     public List<TreeNode> Children { get; private set; } 
     public TreeNode(Data data) 
     { 
      Data = data; 
      Children = new List<TreeNode>(); 
     } 
     public void AddChild(TreeNode child) 
     { 
      Children.Add(child); 
     } 
     public bool AllChildrenTestGUSelectedYes() 
     { 
      if (Children.Count == 0) 
      { 
       return Data.TestGUSelected == Data.Selected.Yes; 
      } 
      bool allChildrenYes = true; 
      foreach (TreeNode child in Children) 
      { 
       if (!child.AllChildrenTestGUSelectedYes()) 
       { 
        allChildrenYes = false; 
        break; 
       } 
      } 
      return allChildrenYes; 
     } 
    } 

    public class Data 
    { 
     public int ViewOrder { get; set; } 
     public ViewType Type { get; set; } 
     public string TestName { get; set; } 
     public Selected TestGUSelected { get; set; } 
     public Data(int viewOrder, ViewType type, string testName, Selected testGUSelected) 
     { 
      ViewOrder = viewOrder; 
      Type = type; 
      TestName = testName; 
      TestGUSelected = testGUSelected; 
     } 
     public override string ToString() 
     { 
      return "viewOrder:" + ViewOrder + " type:" + Type + " testName:" + TestName + " testGUSelected:" + TestGUSelected; 
     } 

     public enum ViewType 
     { 
      A, B, C 
     } 

     public enum Selected 
     { 
      Yes, No 
     } 
    } 
}