2016-07-28 6 views
0

Я вызываю API для получения списка контактов (они могут быть в 100 или 1000 годах) и перечислять только списки по 100 за раз, и это дает мне эту возможность разбиения на страницы с помощью объект в конце списка под названием «следующая страница» и с URL-адресом для следующих 100 и т. д.Выполнение одного и того же метода несколько раз с различными параметрами в C#

так что в моем коде C# и я получаю первые 100 и перебираю их (что-то делать) nextpage 'и получение URL-адреса и повторное вызов API и т. д. выглядит так: цепочка следующей страницы продолжается в зависимости от того, сколько у нас контактов.

Не могли бы вы сообщить мне, есть ли способ для меня пройти через один и тот же код и все еще иметь возможность использовать новый URL-адрес из объекта «nextpage» и запускать логику для каждых 100, которые я получаю?

+0

Почему бы не использовать свойство класса, чтобы его сохранить? действительно не уверен, в чем проблема, если у вас уже есть все переменные, почему бы не сохранить ссылку на них? – Arjang

+0

Да, но как отремонтировать тот же метод? – Bokbob

+0

Можете скопировать код, который вы использовали? @Bokbob – MoustafaS

ответ

0

псевдо-код, так как у нас нет никаких конкретных примеров работы с, но ...

Большинство API, с нумерацией страниц будет иметь общее количество элементов. Вы можете установить максимальное количество элементов на итерацию и отслеживать ее так же, или проверить нулевой следующий_объект, в зависимости от того, как API обрабатывает его.

List<ApiObject> GetObjects() { 

    const int ITERATION_COUNT = 100; 
    int objectsCount = GetAPICount(); 

    var ApiObjects = new List<ApiObject>(); 

    for (int i = 0; i < objectsCount; i+= ITERATION_COUNT) { 

     // get the next 100 
     var apiObjects = callToAPI(i, ITERATION_COUNT); // pass the current offset, request the max per call 
     ApiObjects.AddRange(apiObjects); 

    } // this loop will stop after you've reached objectsCount, so you should have all 

    return ApiObjects; 
} 

// alternatively: 

List<ApiObject> GetObjects() { 

    var nextObject = null; 
    var ApiObjects = new List<ApiObject>(); 

    // get the first batch 
    var apiObjects = callToAPI(null); 
    ApiObjects.AddRange(apiObjects); 
    nextObject = callResponse.nextObject; 

    // and continue to loop until there's none left 
    while (nextObject != null) { 

     var apiObjects = callToAPI(null); 
     ApiObjects.AddRange(apiObjects); 
     nextObject = callResponse.nextObject; 
    } 

    return apiObjects; 
} 

Это основная идея в любом случае, на двух обычных подходов веб-службы (с большим количеством деталей опущены, так как это не работает код, но только хотел продемонстрировать общий подход).

+0

Большое вам спасибо jdl134679, он работает как шарм. – Bokbob

+0

Рад помочь. В качестве побочного примечания обычно рекомендуется сначала извлечь все из веб-службы (поместить все в одну коллекцию) и * затем * обработать всю коллекцию после того, как вы ее извлекли. Это удерживает «окно веб-службы» узким и помогает отделить источник данных от фактической бизнес-логики. (заметное исключение здесь было бы, если бы у вас было много данных, чтобы получить и захотеть начать его обрабатывать асинхронным образом, и в этом случае такой подход немного изменится) – jleach

+0

Да о данных я не уверен, сколько мы могли ожидать. Но все вызовы синхронны, поскольку другой вызов зависит от результата первого вызова и так далее. – Bokbob

Смежные вопросы