public override int GetHashCode() { unchecked { int result = Id.GetHashCode(); result = (result * 397) ^ Type.GetHashCode(); result = (result * 397) ^ IsChild.GetHashCode(); return(result); } }
/// <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); }
/// <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); }
/// <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); }