private void RemoveItem(HrItem item) { Contract.Requires(item != null); Contract.Ensures(!hrItems.Contains(item)); var hrItemsCopy = new HashSet <HrItem>(hrItems); if (hrItems.Remove(item)) { // обновляем другую сторону many-2-many if (item.Word != null) { item.Word.RemoveHr(this); } EditHelper.Edit("HrItems", hrItemsCopy); if (InEdit) { IsDirty = true; } } }
public static ConfWithHio GetConfindenceHrItemObject(this HrItem hi) { Contract.Requires(hi != null); return(new ConfWithHio(hi.Entity, hi.Confidence)); }
/// <summary> /// Устанавливает сущности элементов записи. /// Полученные элементы нумеруются по порядку. /// </summary> public virtual void SetItems(IList <ConfWithHio> willChios) { Contract.Requires(willChios != null); Contract.Ensures(HrItems.Count() == willChios.Count); Contract.Ensures(HrItems.Select(x => x.Entity) .ScrambledEquals(willChios.Select(x => x.HIO))); // same HIOs Contract.Ensures(HrItems.IsUnique(x => x.Ord)); Contract.Ensures(HrItems.Select(x => x.Word).Where(x => x != null).All(x => x.HealthRecords.Contains(this))); // word2hr relation var hrItems = HrItems.ToList(); var wasChios = hrItems.Select(x => x.GetConfindenceHrItemObject()).ToList(); logger.DebugFormat("set HrItems. Chios was: {0}, will: {1}", wasChios.FlattenString(), willChios.FlattenString()); // items to be in Hr = this.HrItems - itemsToRem + itemsToAdd var itemsToBe = new List <HrItem>(); var itemsToRem = new List <HrItem>(); var itemsToAdd = new List <HrItem>(); var willBag = new Bag <ConfWithHio>(willChios); var wasBag = new Bag <ConfWithHio>(wasChios); // добалвяем все существующие, чьи сущности не надо убирать var toR = wasBag.Difference(willBag); for (int i = 0; i < wasChios.Count; i++) { if (toR.Contains(wasChios[i])) // убрать { toR.Remove(wasChios[i]); itemsToRem.Add(hrItems[i]); } else // оставить { itemsToBe.Add(hrItems[i]); } } // добавляем новые var toA = willBag.Difference(wasBag); foreach (var item in toA) { var n = new HrItem(this, item.HIO) { Confidence = item.Confidence }; itemsToAdd.Add(n); itemsToBe.Add(n); } logger.DebugFormat("set HrItems. itemsToAdd: {0}, itemsToRem: {1}", itemsToAdd.FlattenString(), itemsToRem.FlattenString()); // индексы начала поиска в автокомплите для каждой сущности var dict = new Dictionary <IHrItemObject, int>(); // ставим порядок bool reordered = false; var hiosToBe = willChios.Select(x => x.HIO).ToList(); for (int i = 0; i < itemsToBe.Count; i++) { var e = itemsToBe[i].Entity; int start = 0; dict.TryGetValue(e, out start); var index = hiosToBe.IndexOf(e, start); Debug.Assert(index != -1, "hiosToBe does not contain entity from itemsToBe"); dict[e] = index + 1; reordered = itemsToBe[i].Ord != index; itemsToBe[i].Ord = index; } logger.DebugFormat("set HrItems. itemsToBe: {0}", itemsToBe.FlattenString()); foreach (var item in itemsToRem) { this.RemoveItem(item); } // добавляем элементы уже с порядком foreach (var item in itemsToAdd) { this.AddItem(item); } if (reordered || itemsToRem.Count > 0 || itemsToAdd.Count > 0) { OnItemsChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); } }