Sou novo em C# e tenho esse código abaixo fazendo várias chamadas de API. Esse código funciona bem, pois posso ver que ele listResults
tem as respostas de cada chamada.
List<string> listResults = new();
var listIDs = new List<string>
{
"ID1",
"ID2",
"ID3"
};
string baseURL = $"https://API_URL/id=";
var postTasks = listIDs.Select(p => client.GetStringAsync(baseURL + p));
var posts = await System.Threading.Tasks.Task.WhenAll(postTasks);
foreach (var postContent in posts)
{
listResults.Add(postContent);
Debug.WriteLine(postContent);
}
Agora quero armazenar a string de resposta na lista de 2 colunas: a 1ª coluna é o ID e a 2ª coluna é a string de resposta.
Então eu tenho este modelo de resposta:
public class ItemResponseJsonModel
{
public string ID { get; set; }
public string ResponseJSON { get; set; }
}
Então tentei implementar a lista com o modelo no código abaixo, mas foi aí que fiquei preso em como adicionar o ID na primeira coluna de listResults
cada resposta.
List<ItemResponseJsonModel> listResults = new();
var listIDs = new List<string>
{
"ID1",
"ID2",
"ID3"
};
string baseURL = $"https://API_URL/id=";
var postTasks = listIDs.Select(p => client.GetStringAsync(baseURL + p));
var posts = await System.Threading.Tasks.Task.WhenAll(postTasks);
foreach (var postContent in posts)
{
listResults.Add(postContent); // This is where the error will say cannot convert string to ItemResponseJsonModel.
Debug.WriteLine(postContent);
}
Quero que o resultado final listResults
fique como abaixo, onde a primeira coluna é o ID e a segunda coluna é a string de resposta.
listResults {
{ ID = "ID1", ResponseJSON = "ResponseJSON" },
{ ID = "ID2", ResponseJSON = "ResponseJSON" },
{ ID = "ID3", ResponseJSON = "ResponseJSON" },
}
Como posso fazer isso? Posso armazená-lo no Dictionary<string, string>
?
Se você quiser adicionar um objeto a uma lista de um tipo específico, você tem que obter ou gerar uma instância desse tipo. por exemplo
new ItemResponseJsonModel()
. Se você quiser adicionarItemResponseJsonModel
a um,List<ItemResponseJsonModel>
você tem que criá-lo e então adicioná-lo. C# oferece açúcar sintático para facilitar para você. por exemplo..Select(x => new ItemResponseJsonModel())
Você pode criar o objeto desejado na hora dentro do método linq select. Eu tentei fazer o mínimo de alterações possível no seu código:O que está fazendo:
Esta linha é:
Fazendo um loop em cada ID em
listIDs
Para cada ID (
p
), ele chama de forma assíncrona uma solicitação HTTP GETclient.GetStringAsync()
para obter uma resposta da API.Depois que a resposta é recuperada, ela cria uma instância dinâmica do tipo
ItemResponseJsonModel
com:ID
definido comop
(o ID atual)ResponseJSON
definido como a string JSON real retornada pela API.Ele produz uma coleção de Task<ItemResponseJsonModel> (por causa do
async
lambda).O resultado,
postTasks
, é um IEnumerable<Task<ItemResponseJsonModel>> – portanto, uma lista de tarefas que, quando aguardadas, fornecerão os modelos de resposta.