internal IEnumerable <IPicLibFolder> InternalCompareSnapshot(IEnumerable <IPicLibFolder> oldOnes, IEnumerable <IPicLibFolder> newOnes) { if (oldOnes == null) { foreach (var item in newOnes) { var deeper = InternalCompareSnapshot(null, item.Folders); foreach (var itemdeep in deeper) { yield return(itemdeep); } } } var setDiff = newOnes.ToDictionary(x => x.UriString, x => x); foreach (var item in oldOnes) { IPicLibFolder target = null; if (setDiff.TryGetValue(item.UriString, out target)) { if (target.FileCount == item.FileCount && target.Folders.Count == item.Folders.Count && target.LastFileEditTime == item.LastFileEditTime ) { setDiff.Remove(target.UriString); } } } //var setNameCommon = new SortedSet<IPicLibFolder>(newOnes, compUrlEqual); //setNameCommon.IntersectWith(oldOnes); var dictOldOnes = oldOnes.ToDictionary(x => x.UriString, x => x); foreach (var item in setDiff) { yield return(item.Value); IPicLibFolder oldOne = null; dictOldOnes.TryGetValue(item.Value.UriString, out oldOne); var deeperOldOnes = oldOne?.Folders; var depperNewOnes = item.Value.Folders; var deeper = InternalCompareSnapshot(deeperOldOnes, depperNewOnes); foreach (var itemdeep in deeper) { yield return(itemdeep); } } }
internal async Task InternalSaveSnapshotAsync(IPicLibFolder[] folders) { var sl = new System.Runtime.Serialization.DataContractSerializer(typeof(PicLibFolder[])); var ms = new MemoryStream(); sl.WriteObject(ms, folders.OfType<PicLibFolder>().ToArray()); ms.Position = 0; GetCacheFile(CreationCollisionOption.ReplaceExisting); var f = await workingFile; using (var ws = await f.OpenStreamForWriteAsync()) { await ms.CopyToAsync(ws); } }
public bool Equals(IPicLibFolder other) { return(UriString == other.UriString && LastFileEditTime == other.LastFileEditTime && this.FileCount == other.FileCount); }