public override int GetHashCode()
 {
     unchecked
     {
         int result = Id.GetHashCode();
         result = (result * 397) ^ Type.GetHashCode();
         result = (result * 397) ^ IsChild.GetHashCode();
         return(result);
     }
 }
Example #2
0
 /// <summary>
 /// 将列表数据转换为树数据
 /// </summary>
 /// <param name="list">列表数据</param>
 /// <param name="root">一个根,如果传入null,返回一个新的根。</param>
 /// <param name="isChild">判断第二个对象是否为第一个对象子节点的方法</param>
 /// <returns>树根</returns>
 private TreeNode <T> fromList1(IEnumerable <T> list, TreeNode <T> root, IsChild <T> isChild)
 {
     foreach (var i in list)
     {
         if (root.Data != null && root.Data.Equals(i))
         {
             continue;
         }
         if (isChild(root.Data, i))
         {
             var tempList = list.Where(m => !m.Equals(i));
             fromList1(tempList, AddChild(root, i), isChild);
         }
     }
     return(root);
 }
        public bool FilterAndAddChildren(IEnumerable <BaseDataItem> potentialChildren)
        {
            bool changed = false;

            foreach (D item in potentialChildren.OfType <D>())
            {
                if (IsChild.Invoke(item))
                {
                    var createdChild = CreateChildMethod.Invoke(item);

                    if (createdChild != null)
                    {
                        AddChildMethod.Invoke(createdChild);
                        changed = true;
                    }
                }
            }

            return(changed);
        }
Example #4
0
        /// <summary>
        /// 将列表数据转换为树数据
        /// </summary>
        /// <param name="list">数据列表</param>
        /// <param name="isChild">判断一个节点是否为另一个节点的子节点</param>
        /// <param name="isRoot">判断一个节点是否为根节点</param>
        /// <returns></returns>
        public virtual TreeRoot <T> FromList(IEnumerable <T> list, IsChild <T> isChild, Func <T, bool> isRoot)
        {
            var root = new TreeRoot <T> {
                Children = new List <TreeNode <T> >()
            };

            list = list.Where(m => m != null);
            var nodeList = new List <TreeNode <T> >();

            nodeList.AddRange(list.Select(m => new TreeNode <T> {
                Children = new List <TreeNode <T> >(),
                Data     = m, Father = null,
            }));
            nodeList.ForEach(m => {
                if (isRoot(m.Data))
                {
                    root.Children.Add(m);
                }
            });
            root.Children.ForEach(m => fromList1(list, m, isChild));
            return(root);
        }
        public bool HandleChanges(DataChangedEvent e)
        {
            bool changed = false;

            List <V> toRemove = new List <V>();
            List <V> toReSort = new List <V>();

            foreach (V child in Children)
            {
                // If it was deleted, then we mark it for remove
                if (e.DeletedItems.Contains(child.Identifier))
                {
                    toRemove.Add(child);
                }

                else
                {
                    D edited = e.EditedItems.OfType <D>().FirstOrDefault(i => i.Identifier == child.Identifier);

                    // If it was edited
                    if (edited != null)
                    {
                        // If it's still a child, we'll need to re-sort it
                        if (IsChild.Invoke(edited))
                        {
                            toReSort.Add(child);
                        }

                        // Otherwise it's no longer a child, so remove it from this parent
                        else
                        {
                            toRemove.Add(child);
                        }
                    }
                }
            }

            if (toRemove.Count > 0 || toReSort.Count > 0)
            {
                changed = true;
            }

            // Now remove all that need removing
            foreach (V item in toRemove)
            {
                RemoveChildMethod.Invoke(item);
            }

            // And re-sort all that need re-sorting
            foreach (V item in toReSort)
            {
                // First remove
                RemoveChildMethod.Invoke(item);

                // Then re-add
                AddChildMethod.Invoke(item);
            }


            // And also add items that currently aren't children, but were edited and may be new children
            if (FilterAndAddChildren(e.EditedItems.Where(i => !Children.Any(c => c.Identifier == i.Identifier))))
            {
                changed = true;
            }

            // And now add the new items
            if (FilterAndAddChildren(e.NewItems))
            {
                changed = true;
            }

            return(changed);
        }
Example #6
0
        /// <summary>
        /// Creates an XML element containing the data for the guest
        /// </summary>
        /// <param name="document">XML document the element will be added to</param>
        /// <returns>XML element containing the data for the guest</returns>
        internal XmlElement ToXml(XmlDocument document)
        {
            XmlElement guest = document.CreateElement("GUEST");

            XmlAttribute id = document.CreateAttribute("Id");

            id.Value = Id.ToString();
            guest.Attributes.Append(id);

            XmlElement forename = document.CreateElement("FORENAME");

            forename.InnerText = Forename;
            guest.AppendChild(forename);

            XmlElement surname = document.CreateElement("SURNAME");

            surname.InnerText = Surname;
            guest.AppendChild(surname);

            XmlAttribute isAttending = document.CreateAttribute("IsAttending");

            isAttending.Value = (IsAttending.HasValue ? IsAttending.ToString() : String.Empty);
            guest.Attributes.Append(isAttending);

            XmlAttribute dateOfRsvp = document.CreateAttribute("DateOfRsvp");

            dateOfRsvp.Value = (DateOfRsvp.HasValue ? DateOfRsvp.ToString() : String.Empty);
            guest.Attributes.Append(dateOfRsvp);

            XmlAttribute isChild = document.CreateAttribute("IsChild");

            isChild.Value = IsChild.ToString();
            guest.Attributes.Append(isChild);

            XmlAttribute isVegetarian = document.CreateAttribute("IsVegetarian");

            isVegetarian.Value = IsVegetarian.ToString();
            guest.Attributes.Append(isVegetarian);

            XmlElement plusOne = document.CreateElement("PLUS_ONE");

            guest.AppendChild(plusOne);

            XmlAttribute canBringPlusOne = document.CreateAttribute("CanBringPlusOne");

            canBringPlusOne.Value = CanBringPlusOne.ToString();
            plusOne.Attributes.Append(canBringPlusOne);

            XmlAttribute isBringingPlusOne = document.CreateAttribute("IsBringingPlusOne");

            isBringingPlusOne.Value = IsBringingPlusOne.ToString();
            plusOne.Attributes.Append(isBringingPlusOne);

            XmlElement plusOneForename = document.CreateElement("FORENAME");

            plusOneForename.InnerText = PlusOneForename;
            plusOne.AppendChild(plusOneForename);

            XmlElement plusOneSurname = document.CreateElement("SURNAME");

            plusOneSurname.InnerText = PlusOneSurname;
            plusOne.AppendChild(plusOneSurname);

            XmlAttribute plusOneIsVegetarian = document.CreateAttribute("IsVegetarian");

            plusOneIsVegetarian.Value = PlusOneIsVegetarian.ToString();
            plusOne.Attributes.Append(plusOneIsVegetarian);

            XmlElement notes = document.CreateElement("NOTES");

            notes.InnerText = Notes;
            guest.AppendChild(notes);

            return(guest);
        }