2011-01-07 89 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 
     } 
    } 
}