Tomash Vovran
Tomash Vovran

Reputation: 43

Return two collections in one

how can i add collection to another collection? I am returnging one collection _lastOpenedArticles and if that collection has less than 3 articles i need to add articles from allUsersArticles. However i keep getting article from collection _lastOpenedArticles 3 times. Can you help please.

 async Task ShowLastListenedAsync(List<Article> allUserArticles)
      {
           
            var downloadedArticles = LangUpDataSaverLoader.DeserializeAllOptimizationData();
            if (_lastOpenedArticles != null && _lastOpenedArticles.Count > 0)
            {
                foreach (var article in _lastOpenedArticles.Take(3))
                {
                    var filename = string.Format(SharedConstants.ArticleImageUrl, SharedConstants.ApiBaseUri, article.Id);

                    var newCell = new ArticleDetailData()
                    {
                        Author = article.Author,
                        Id = article.Id,
                    };
                    if (downloadedArticles.DownloadedArticles.Any(m => m.Id == article.Id))
                    {
                        newCell.BackgroundImage = article.Id.ArticleImageFile();
                    }
                    else
                    {
                        newCell.BackgroundImage = filename;
                    }
                    var sec = article.Category;
                    if (sec == null)
                    {
                        newCell.Section = " ";
                    }
                    else
                    {
                        newCell.Section = article.Category;
                    }
                   
                    LastThreeArticles.Add(newCell);

                    if (_lastOpenedArticles.Count < 3)
                    {
                        foreach (var art in allUserArticles.Take(3))
                        {
                           filename = string.Format(SharedConstants.ArticleImageUrl, SharedConstants.ApiBaseUri, article.Id);
                            var cell = new ArticleDetailData()
                            {
                                Author = article.Author,
                                BackgroundImage = filename,
                                Id = article.Id,
                            };
                            sec = article.Category;
                            if (sec == null)
                            {
                                cell.Section = " ";
                            }
                            else
                            {
                                cell.Section = article.Category;
                            }
                            LastThreeArticles.Add(cell);
                        }
                        await  FillAnonymousArticles(allUserArticles);
                    }
                }
            }
  
            else
            {
               await  FillAnonymousArticles(allUserArticles);
            } 
        }

Upvotes: 0

Views: 89

Answers (2)

Markus
Markus

Reputation: 22511

Instead of checking the count in the for loop, I'd propose to move the check whether you already have 3 articles after the loop. So you avoid to get the articles 3 times (once for each run of the loop):

async Task ShowLastListenedAsync(List<Article> allUserArticles)
{
    var downloadedArticles = LangUpDataSaverLoader.DeserializeAllOptimizationData();
    if (_lastOpenedArticles != null && _lastOpenedArticles.Count > 0)
    {
        foreach (var article in _lastOpenedArticles.Take(3))
        {
            var filename = string.Format(SharedConstants.ArticleImageUrl, SharedConstants.ApiBaseUri, article.Id);
            var newCell = new ArticleDetailData()
            {
                Author = article.Author,
                Id = article.Id,
            };
            if (downloadedArticles.DownloadedArticles.Any(m => m.Id == article.Id))
            {
                newCell.BackgroundImage = article.Id.ArticleImageFile();
            }
            else
            {
                newCell.BackgroundImage = filename;
            }
            var sec = article.Category;
            if (sec == null)
            {
                newCell.Section = " ";
            }
            else
            {
                newCell.Section = article.Category;
            }
            LastThreeArticles.Add(newCell);
       }
       // Move this check out of the for loop
       if (_lastOpenedArticles.Count < 3)
       {
           foreach (var art in allUserArticles.Take(3))
           {
               filename = string.Format(SharedConstants.ArticleImageUrl, SharedConstants.ApiBaseUri, article.Id);
               var cell = new ArticleDetailData()
               {
                   Author = article.Author,
                   BackgroundImage = filename,
                   Id = article.Id,
               };
               sec = article.Category;
               if (sec == null)
               {
                   cell.Section = " ";
               }
               else
               {
                   cell.Section = article.Category;
               }
               LastThreeArticles.Add(cell);
           }
           await  FillAnonymousArticles(allUserArticles);
        }
    }
    else
    {
        await  FillAnonymousArticles(allUserArticles);
    } 
}

In addition, you could use Linq to create a union of the lists. This will result in much shorter code, for example:

_lastOpenedArticles
    .Union(allUserArticles)       
    .Take(3)
    .Select(x => ConvertToCell(x)) // You need this method that converts the articles to a cell
    .ToArray();                    // If you need a list, you can also use ToList()

Upvotes: 1

Roman Kalinchuk
Roman Kalinchuk

Reputation: 728

_lastOpenedArticles.AddRange(allUserArticles)
_lastOpenedArticles.Concat(allUserArticles)

the last one returns IEnumerable<T> and first one is void. Take one that suits you better

Upvotes: 0

Related Questions