Jak to przerobić funkcyjnie?

0

Napisałem taki kod:

var toAdd = new List<Product> {};

int page = 1;
int productsPerPage = 100;
List<Product> singlePage;

do
{
    singlePage = await Wc.Product.GetAll
    (
        new Dictionary<string, string>
        {
            {"page", page.ToString() },
            {"per_page", productsPerPage.ToString() }
        }
    );
    
    productsToAdd.AddRange(singlePage);
    page++;
}
while(singlePage.Count == productsPerPage);

Products = new ReadOnlyDictionary<string, Product>(productsToAdd.ToDictionary(p => p.sku));

(czytanie z zewnętrznego serwisu który wymusza paginację)

To zuo, bo tu są mutacje.

Ale poważnie -w tym konkretnym wypadku nie mam bladego pojęcia jak to przepisać tak, by nie było mutacji. A już na pewno nie bez tworzenia przerostu formy nad treścią.

Ma ktoś jakies pomysły w tym zakresie?

0

Sorry ze nie w C# ale generalnie to jakos tak (1 to pageNum) flatMap { page => getPage(page) } gdzie getPage(page: Int): List[Product]

EDIT: bo chyba dasz rade wyciagnac ile tych stron jest?

0

@stivens:

stivens napisał(a):

EDIT: bo chyba dasz rade wyciagnac ile tych stron jest?

Niestety nie. Muszę iterować strona po stronie aż któraś zwróci za mało elementów.

0

No to rekurencyjnie.

EDIT: w sensie tail-recursion z akumulatorem

def fetchAndAccumulate(page: Int, acc: List[List[Product]]): List[Product] = {
  val currPage = getPage(page)
  val all = currPage :: acc
  if (currPage.length < productsPerPage) all.flatten
  else fetchAndAccumulate(page + 1, all)

1 użytkowników online, w tym zalogowanych: 0, gości: 1