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);
 }