Получение коллекции из ассинхронного вызова - C#
Формулировка задачи:
Здравствуйте. Есть классы, с помощью которых парсится json файл
Подскажите, как теперь правильно получить коллекцию данных?
Пытаюсь так, но не знаю, как дальше извлекать данные (например, переменной задать заголовок string Title = groups[0].Title)
Думаю, что вообще не правильно осуществляю асинхронный вызов. Хотя данные в переменную заполняются(см рисунок).
public class SampleDataItem
{
public SampleDataItem(String uniqueId, String title, String subtitle, String imagePath, String description, String content)
{
this.UniqueId = uniqueId;
this.Title = title;
this.Subtitle = subtitle;
this.Description = description;
this.ImagePath = imagePath;
this.Content = content;
}
public string UniqueId { get; private set; }
public string Title { get; private set; }
public string Subtitle { get; private set; }
public string Description { get; private set; }
public string ImagePath { get; private set; }
public string Content { get; private set; }
public override string ToString()
{
return this.Title;
}
}
public class SampleDataGroup
{
public SampleDataGroup(String uniqueId, String title, String subtitle, String imagePath, String description)
{
this.UniqueId = uniqueId;
this.Title = title;
this.Subtitle = subtitle;
this.Description = description;
this.ImagePath = imagePath;
this.Items = new ObservableCollection<SampleDataItem>();
}
public string UniqueId { get; private set; }
public string Title { get; private set; }
public string Subtitle { get; private set; }
public string Description { get; private set; }
public string ImagePath { get; private set; }
public ObservableCollection<SampleDataItem> Items { get; private set; }
public override string ToString()
{
return this.Title;
}
}
public sealed class SampleDataSource
{
private static SampleDataSource _sampleDataSource = new SampleDataSource();
private ObservableCollection<SampleDataGroup> _groups = new ObservableCollection<SampleDataGroup>();
private static AssetManager _asset = null;
public static AssetManager Asset
{
get { return SampleDataSource._asset; }
set { SampleDataSource._asset = value; }
}
public ObservableCollection<SampleDataGroup> Groups
{
get { return this._groups; }
}
public static async Task<IEnumerable<SampleDataGroup>> GetGroupsAsync()
{
await _sampleDataSource.GetSampleDataAsync();
return _sampleDataSource.Groups;
}
public static async Task<SampleDataGroup> GetGroupAsync(string uniqueId)
{
await _sampleDataSource.GetSampleDataAsync();
// Для небольших наборов данных можно использовать простой линейный поиск
var matches = _sampleDataSource.Groups.Where((group) => group.UniqueId.Equals(uniqueId));
if (matches.Count() == 1) return matches.First();
return null;
}
public static async Task<SampleDataItem> GetItemAsync(string uniqueId)
{
await _sampleDataSource.GetSampleDataAsync();
// Для небольших наборов данных можно использовать простой линейный поиск
var matches = _sampleDataSource.Groups.SelectMany(group => group.Items).Where((item) => item.UniqueId.Equals(uniqueId));
if (matches.Count() == 1) return matches.First();
return null;
}
private async Task GetSampleDataAsync()
{
if (this._groups.Count != 0) return;
StreamReader strm = new StreamReader(Asset.Open("SampleData.json"));
string jsonText = await strm.ReadToEndAsync();
JSONObject jsonObject = new JSONObject(jsonText);
JSONArray jsonArray = jsonObject.GetJSONArray("Groups");
for (int i = 0; i < jsonArray.Length(); i++)
{
JSONObject groupObject = jsonArray.GetJSONObject(i);
SampleDataGroup group = new SampleDataGroup(groupObject.GetString("UniqueId"),
groupObject.GetString("Title"),
groupObject.GetString("Subtitle"),
groupObject.GetString("ImagePath"),
groupObject.GetString("Description"));
JSONArray jsonArrayItems = groupObject.GetJSONArray("Items");
for (int j = 0; j < jsonArrayItems.Length(); j++)
{
JSONObject itemObject = jsonArrayItems.GetJSONObject(j);
group.Items.Add(new SampleDataItem(itemObject.GetString("UniqueId"),
itemObject.GetString("Title"),
itemObject.GetString("Subtitle"),
itemObject.GetString("ImagePath"),
itemObject.GetString("Description"),
itemObject.GetString("Content")));
}
this.Groups.Add(group);
}
}
}Task<IEnumerable<SampleDataGroup>> groups = SampleDataSource.GetGroupsAsync();
Решение задачи: «Получение коллекции из ассинхронного вызова»
textual
Листинг программы
IEnumerable<SampleDataGroup> groups = await SampleDataSource.GetGroupsAsync();