You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中将多任务API响应与ID关联存储为双列结构?

解决C#异步API请求中ID与响应关联的问题

一、使用自定义ItemResponseJsonModel实现关联

你之前的问题核心是丢失了ID和响应的对应关系,同时直接将string类型的响应添加到List<ItemResponseJsonModel>中导致类型不匹配。只需修改异步任务的定义,让每个任务同时返回ID和对应的响应即可:

List<ItemResponseJsonModel> listResults = new();
var listIDs = new List<string>
{
    "ID1",
    "ID2",
    "ID3"
};

string baseURL = "https://API_URL/id=";
// 修改Select逻辑,让每个任务返回包含ID和响应的ItemResponseJsonModel
var postTasks = listIDs.Select(async p => new ItemResponseJsonModel
{
    ID = p,
    ResponseJSON = await client.GetStringAsync(baseURL + p)
});
// WhenAll后直接得到ItemResponseJsonModel数组
var posts = await Task.WhenAll(postTasks);
// 直接将数组转为列表,或者逐个添加
listResults.AddRange(posts);

// 验证输出
foreach (var item in listResults)
{
    Debug.WriteLine($"ID: {item.ID}, Response: {item.ResponseJSON}");
}

关键改动说明:

  • 将Select(p => client.GetStringAsync(...))改为异步lambda表达式,先执行API请求,再返回实例化好的ItemResponseJsonModel,确保ID和响应一一绑定。
  • Task.WhenAll会等待所有任务完成,返回的posts直接是ItemResponseJsonModel[]类型,无需再手动关联索引,避免顺序错误。

二、是否可以用Dictionary<string, string>存储?

完全可以,如果你不需要自定义模型,只是需要快速通过ID查找响应,Dictionary<string, string>是更简洁的选择:

Dictionary<string, string> responseDict = new();
var listIDs = new List<string>
{
    "ID1",
    "ID2",
    "ID3"
};

string baseURL = "https://API_URL/id=";
var postTasks = listIDs.Select(async p =>
{
    var response = await client.GetStringAsync(baseURL + p);
    return new KeyValuePair<string, string>(p, response);
});
var keyValuePairs = await Task.WhenAll(postTasks);
foreach (var kvp in keyValuePairs)
{
    responseDict.Add(kvp.Key, kvp.Value);
}

// 验证输出
foreach (var kvp in responseDict)
{
    Debug.WriteLine($"ID: {kvp.Key}, Response: {kvp.Value}");
}

两种方案对比:

  • 自定义模型:适合后续需要扩展字段(比如添加请求时间、状态码等)的场景,结构更清晰,可读性更强。
  • Dictionary:适合仅需ID和响应的简单映射,代码更简洁,支持通过responseDict["ID1"]快速查询对应响应。

内容的提问来源于stack exchange,提问作者Milacay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 12:44:57