Ich habe eine TextBox in einer C#-Form, immer, wenn sich der dort eingegebene Text ändert, wird ein Ereignis ausgelöst, und das Ziel ist es, dass ich den jeweils aktuellen Text einer Geolokation übergebe, sodass entsprechend dem eingegebenen Text geographische Orte vorgeschlagen werden können, z. B. Für „Ber“ „Berlin“ usw.:
private void addressTextBox_TextChanged(object? sender, EventArgs e)
{
string entry = addressTextBox.Text;
geoFile.Entry(entry);
}
public async Task<string> InitAsync(string query)
{
string apiUrl = "foo";
string apiKey = "bar";
JArray suggestions = new JArray();
try
{
string url = $"{apiUrl}?query={query}&apikey={apiKey}";
HttpResponseMessage response = await client.GetAsync(url);
response.EnsureSuccessStatusCode();
string responseBody = await response.Content.ReadAsStringAsync();
// Parsing des JSON-Antwortkörpers
var json = JObject.Parse(responseBody);
suggestions = (JArray)json["suggestions"];
}
catch (HttpRequestException e)
{
Console.WriteLine($"Request error: {e.Message}");
}
return suggestions.ToString();
}
public async void Entry(string entry)
{
static async Task<(bool, string)> TryGetHtml(string url)
{
if (string.IsNullOrEmpty(url))
{
return (false, null);
}
string html = await new HttpClient().GetStringAsync(url);
return (true, html);
}
string res = await InitAsync(entry);
}
Macht man das überhaupt so oder ist dies nicht die Weise, in welcher das umgesetzt wird?
Hallo Andi153,
Hinweise zum Code:
HttpClient
nicht jedes mal neu erstellen → Guidelines for using HttpClientstring
ist nicht nötigJArray
wäre besser einen eigenen Typ zu haben, zu dem deserialisiert wirdWenn zu jedem TextChanged
-Ereignis ein HTTP-Request durchgeführt wird, so ist das ziemlich unperformant.
Da sollte zumindest eine Art "debouncing" eingeführt werden (bitte selbst danach suchen).
Gehts dir jetzt um Geolokation, also Koordinaten → Ortsname, od. nur um Suchvervollständigung wie "Ber" → "Berlin"?
Entsprechend dem Beispiel der Frage, so sollten mehrere Treffer angezeigt werden, denn für "Ber" könnte auch "Bernhaupten" passen. Mit welcher Priorisierung die möglichen Treffer angezeigt werden hängt vom deinem Anwendungsfall ab.
Ist die mögliche Suchmenge überschaubar, z.B. nur Städte in Deutschland, und wenn die Suchmenge als eher fix angenommen werden kann (so schnell ändert sich die Menge der Städte ja nicht), so könntest du anstatt der HTTP-Request die Menge an Städten lokal vorhalten und in diesen lokalen Daten suchen. Zum Suchen hierbei (Textvervollständigung) ist z.B. ein Trie ganz praktisch und effizient.
Sollte das nicht gehen und es sind HTTP-Request nötig, so ist je nach Anwendungstyp (hier wohl Desktop) auch ein lokales Caching möglich.
mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"