private List <Post> LoadWallPosts(CancellationToken cancellationToken, WallLoadParametrs @params, bool customLoad, bool?informImmediately = true) { List <Post> posts = new List <Post>(); WallGetObject tmp; uint offset = @params.Offset.HasValue ? @params.Offset.Value : 0; uint count = _maxPostsPerLoad; //TODO: Дописать чтобы находило оптимальное количество загружаемых постов long lastId = long.MaxValue; // Последний из загруженных (верхняя граница след. итерации) do { try { tmp = getWall(cancellationToken, offset, count); } catch (Exception Ex) { throw new NotImplementedException(Ex.Message); } if (tmp.WallPosts.Count > 0) { var tposts = FilterPosts(tmp, @params, lastId); if (informImmediately == true) { if (customLoad) { if (CustomLoad != null) { CustomLoad(tposts.ToList()); } } else { if (NewPosts != null) { NewPosts(tposts.ToList()); } } } posts.AddRange(tposts); lastId = tmp.WallPosts[tmp.WallPosts.Count - 1].Id.Value; offset += count; } }while (tmp.WallPosts.Count == count && /* Не дошло до конца и загружает все запрашиваемые записи */ (@params.LastPostToLoad == null || lastId > @params.LastPostToLoad.Value) && /* Не дошли до поста, который нужно загрузить (по идентификатору)*/ (@params.Count == null || posts.Count < @params.Count.Value) && /* Не дошли до поста, который нужно загрузить (по количеству) */ tmp.WallPosts.LastOrDefault()?.Date > @params.LastDateToLoad /* Не дошли до поста, который нужно загрузить (по дате) */ ); return(posts); }
/// <summary> /// Выделить из полученных записей те, что удовлетворяют условиям /// </summary> /// <param name="wall">Стена с записями</param> /// <param name="thresholdId">Верхняя граница, до которой записи уже были загружены</param> /// <param name="lastDateToLoad">Дата и время, до которого нужно выбрать посты</param> /// <param name="lastPostToLoad">Последний пост, который нужно выбрать</param> /// <returns></returns> public static List <Post> FilterPosts(WallGetObject wall, WallLoadParametrs p, long thresholdId = long.MaxValue) { var posts = wall.WallPosts; if (posts.Count > 0) { int startIndex = 0; int endIndex = posts.Count - 1; if (posts[0].IsPinned.Value) { startIndex++; } while (startIndex <= endIndex && posts[startIndex].Id >= thresholdId) { startIndex++; } if (p.LastDateToLoad.HasValue) { while (endIndex >= startIndex && posts[endIndex].Date < p.LastDateToLoad.Value) { endIndex--; } } if (p.LastPostToLoad > 0) { while (endIndex >= startIndex && posts[endIndex].Id < p.LastPostToLoad) { endIndex--; } } if (startIndex <= endIndex) { return(posts.Skip(startIndex).Take(endIndex - startIndex + 1).ToList()); } } return(new List <Post>()); }
public static Task<List<Post>> FilterPostsAsync(WallGetObject wall, WallLoadParametrs p, long thresholdId = long.MaxValue) { return Task.Run(() => { return FilterPosts(wall, p, thresholdId); }); }
/// <summary> /// Выделить из полученных записей те, что удовлетворяют условиям /// </summary> /// <param name="wall">Стена с записями</param> /// <param name="thresholdId">Верхняя граница, до которой записи уже были загружены</param> /// <param name="lastDateToLoad">Дата и время, до которого нужно выбрать посты</param> /// <param name="lastPostToLoad">Последний пост, который нужно выбрать</param> /// <returns></returns> public static List<Post> FilterPosts(WallGetObject wall, WallLoadParametrs p, long thresholdId = long.MaxValue) { var posts = wall.WallPosts; if (posts.Count > 0) { int startIndex = 0; int endIndex = posts.Count - 1; if (posts[0].IsPinned.Value) startIndex++; while (startIndex <= endIndex && posts[startIndex].Id >= thresholdId) startIndex++; if (p.LastDateToLoad.HasValue) while (endIndex >= startIndex && posts[endIndex].Date < p.LastDateToLoad.Value) endIndex--; if (p.LastPostToLoad > 0) while (endIndex >= startIndex && posts[endIndex].Id < p.LastPostToLoad) endIndex--; if (startIndex <= endIndex) return posts.Skip(startIndex).Take(endIndex - startIndex + 1).ToList(); } return new List<Post>(); }
/// <summary> /// Загружает список постов со стены сообщества с первого и до указанного и\или указанной даты /// </summary> /// <param name="cancellationToken">Токен отмены загрузки</param> /// <param name="params">Параметры загрузки записей</param> /// <param name="informImmediately">Оповещать о полученых постах через <see cref="CustomLoad"/> как только они загрузяться (null и false выключат оповещение)</param> public Task<List<Post>> LoadWallPostsAsync(CancellationToken cancellationToken, WallLoadParametrs @params, bool? informImmediately = true) { return LoadWallPostsAsync(cancellationToken, @params, true, informImmediately); }
private Task<List<Post>> LoadWallPostsAsync(CancellationToken cancellationToken, WallLoadParametrs @params, bool customLoad, bool? informImmediately = true) { return Task.Run(() => { return LoadWallPosts(cancellationToken, @params, customLoad, informImmediately); }, cancellationToken); }
private List<Post> LoadWallPosts(CancellationToken cancellationToken, WallLoadParametrs @params, bool customLoad, bool? informImmediately = true) { List<Post> posts = new List<Post>(); WallGetObject tmp; uint offset = @params.Offset.HasValue ? @params.Offset.Value : 0; uint count = _maxPostsPerLoad; //TODO: Дописать чтобы находило оптимальное количество загружаемых постов long lastId = long.MaxValue; // Последний из загруженных (верхняя граница след. итерации) do { try { tmp = getWall(cancellationToken, offset, count); } catch (Exception Ex) { throw new NotImplementedException(Ex.Message); } if (tmp.WallPosts.Count > 0) { var tposts = FilterPosts(tmp, @params, lastId); if (informImmediately == true) { if (customLoad) { if (CustomLoad != null) CustomLoad(tposts.ToList()); } else { if (NewPosts != null) NewPosts(tposts.ToList()); } } posts.AddRange(tposts); lastId = tmp.WallPosts[tmp.WallPosts.Count - 1].Id.Value; offset += count; } } while (tmp.WallPosts.Count == count && /* Не дошло до конца и загружает все запрашиваемые записи */ (@params.LastPostToLoad == null || lastId > @params.LastPostToLoad.Value) && /* Не дошли до поста, который нужно загрузить (по идентификатору)*/ (@params.Count == null || posts.Count < @params.Count.Value) && /* Не дошли до поста, который нужно загрузить (по количеству) */ tmp.WallPosts.LastOrDefault()?.Date > @params.LastDateToLoad /* Не дошли до поста, который нужно загрузить (по дате) */ ); return posts; }
public static Task <List <Post> > FilterPostsAsync(WallGetObject wall, WallLoadParametrs p, long thresholdId = long.MaxValue) { return(Task.Run(() => { return FilterPosts(wall, p, thresholdId); })); }
/// <summary> /// Загружает список постов со стены сообщества с первого и до указанного и\или указанной даты /// </summary> /// <param name="cancellationToken">Токен отмены загрузки</param> /// <param name="params">Параметры загрузки записей</param> /// <param name="informImmediately">Оповещать о полученых постах через <see cref="CustomLoad"/> как только они загрузяться (null и false выключат оповещение)</param> public Task <List <Post> > LoadWallPostsAsync(CancellationToken cancellationToken, WallLoadParametrs @params, bool?informImmediately = true) { return(LoadWallPostsAsync(cancellationToken, @params, true, informImmediately)); }
private Task <List <Post> > LoadWallPostsAsync(CancellationToken cancellationToken, WallLoadParametrs @params, bool customLoad, bool?informImmediately = true) { return(Task.Run(() => { return LoadWallPosts(cancellationToken, @params, customLoad, informImmediately); }, cancellationToken)); }