Динамически заполнить модель mvvm из индексированного массива - PullRequest
0 голосов
/ 26 апреля 2018

GetAirports позвольте мне заполнить _airports, если это будет переиндексировано, это означает, что я мог бы также получить аэропорт, если бы использовал _airport[0]

Но для получения аэропортов с этой общедоступной ссылкой API https://desktopapps.ryanair.com/en-gb/res/stations используется индексированный массив с назначенными им объектами. Как я могу динамически заполнить _airports и извлечь их, не зная фактического имени индекса?

public async Task<List<Airports>> GetAirports()
{
    string url = _BASEURL;
    if( _airports == null)
        _airports = await GetAsync<List<Airports>>(url);

    return _airports;
}

Функция GetAsync:

protected async Task<T> GetAsync<T>(string url)
    {
        using (HttpClient client = CreateHttpClient())
        {
            try
            {
                var json = await client.GetStringAsync(url);
                return await Task.Run(() => JsonConvert.DeserializeObject<T>(json));
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
                return default(T);
            }
        }
    }

Модель аэропорта:

public class Airports
{
    public string Name { get; set; }
    public string Country { get; set; }
    public string TimeZone { get; set; }
    public string Latitude { get; set; }
    public string Longitude { get; set; }
}

из API

"AAL":{
    "name":"Aalborg Airport",
    "country":"DK",
    "timeZone":"DK",
    "latitude":"570535N",
    "longitude":"0095100E"
},
"AAR":{...}

1 Ответ

0 голосов
/ 26 апреля 2018

Вот обходной путь, основанный на формате данных, возвращаемых из API.

Добавьте в модель дополнительное свойство для хранения ключа / кода, например AAL

public class Airport { //<-- note the name change of the model
    public string Code { get; set; }
    public string Name { get; set; }
    public string Country { get; set; }
    public string TimeZone { get; set; }
    public string Latitude { get; set; }
    public string Longitude { get; set; }
}

Затем рефакторинг разбора для использования Dictionary<string, Airport> и затем извлечение KeyValuePair s для возврата желаемого типа

public async Task<List<Airport>> GetAirportsAsync() { //<-- note the name change
    string url = _BASEURL;
    if( _airports == null) {
        var data = await GetAsync<Dictionary<string, Airport>>(url);
        _airports = data.Select(_ => {
            var code = _.Key;
            var airport = _.Value;
            airport.Code = code;
            return airport;
        }).ToList();
    }

    return _airports;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...