如何从数据库获取数据存入数组?C#代码实现遇阻求助
解决从API获取数据填充数组的问题
嘿,我看你现在卡在了把从API拿到的产品名称填充到names数组这一步,咱们一步步来搞定它:
先梳理下当前代码的核心问题
GetData用了async void,这种写法除了事件处理函数外非常不推荐——它没法让你正确等待异步操作完成,大概率你会遇到“数据还没加载好就去用names”的情况。names是静态初始化的,没法直接用异步获取到的数据动态填充,得等API请求完成后再赋值。
解决方案分两步走
1. 改造GetData方法,让它能正确返回并填充数据
把async void改成async Task(方便后续等待执行),在拿到反序列化后的产品列表后,提取所有产品的name转换成数组赋值给names:
2. 正确调用异步方法
因为构造函数不能是异步的,所以得在合适的时机(比如页面加载完成、ViewModel初始化时)调用GetData并等待它执行完毕,确保数据加载好后再使用names。
修改后的完整代码示例
public class FeaturedItemList { public List<PagingProduct> products { get; set; } } public class PagingProduct { public string name { get; set; } } public class PagingProductRepository { public ObservableCollection<PagingProduct> pagingProducts { get; set; } public FeaturedItemList products; internal string[] names; // 先不初始化,等数据获取后赋值 public PagingProductRepository() { } // 把async void改成async Task,支持等待操作 public async Task GetData() { using var httpClient = new HttpClient(); // 用using自动释放资源,避免内存泄漏 var json = await httpClient.GetStringAsync("http://orangepotato.rjcpacking.com/index.php?route=api/login/getFeaturedProducts"); products = JsonConvert.DeserializeObject<FeaturedItemList>(json); // 提取所有产品名称,转换成数组赋值给names if (products?.products != null) { names = products.products.Select(product => product.name).ToArray(); } else { // 处理数据为空的边界情况,比如给个空数组默认值 names = Array.Empty<string>(); } } }
怎么调用这个方法
比如在你的ViewModel或者页面初始化代码里:
var productRepo = new PagingProductRepository(); await productRepo.GetData(); // 必须等待数据加载完成 // 现在就可以正常使用productRepo.names了
关键细节说明
- 用
async Task替代async void:这能避免异步操作的“火并忘”问题,让你能精准控制数据加载时机。 - 延迟数组赋值:等API请求和反序列化都完成后,用LINQ的
Select提取名称,ToArray()转换成数组,完美替代原来的静态数据。 - 空值检查:加上
products?.products != null的判断,防止API返回空数据导致的空引用异常,让代码更健壮。
这样修改后,你就能动态把从API获取的产品名称填充到names数组里,彻底替换掉原来的静态测试数据啦!
内容的提问来源于stack exchange,提问作者waqas waqas
相关产品推荐
相关产品推荐

