/// <summary> /// Updates the old collection with new items, while removing the inexistent. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="old"></param> /// <param name="fresh"></param> /// <returns></returns> public static void Update <T>(this IList <T> old, IEnumerable <T> fresh, Func <T, T, bool> isEqual) { if (old == null) { throw new ArgumentNullException("old"); } if (fresh == null) { throw new ArgumentNullException("fresh"); } var diff = fresh.Compare(old, isEqual); foreach (var item in diff.Removed) { var i = old.Where(d => isEqual(d, item)).Select((d, idx) => idx).First(); old.RemoveAt(i); } foreach (var item in diff.Added) { old.Add(item); } }