private async Task RefreshAsync() { var gists = await gistClientService.GetGistsAsync(); Gists.RemoveRange(Gists.Where(g => g.GetType() == typeof(CreateGistViewModel)).ToList()); var newGists = gists.Except(Gists.Select(g => g.Gist), gistEqualityComparer).ToList(); var deletedGists = Gists.Where(g => !gists.Contains(g.Gist, gistEqualityComparer)).ToList(); var existingGists = Gists.Where(g => gists.Contains(g.Gist, gistEqualityComparer)).ToList(); Gists.RemoveRange(deletedGists); Gists.AddRange(newGists.Select(ng => new GistViewModel(ng, gistClientService, AsyncOperationStatusManager, ErrorHandler))); foreach (var existingGist in existingGists) { HandleExistingGist(existingGist, gists.Single(g => g.Id == existingGist.Gist.Id)); } }