Laden...

Frage zur grundlegenden Umsetzung von Textvorschlägen bei Geolocation

Letzter Beitrag vor 25 Tagen 2 Posts 171 Views
Frage zur grundlegenden Umsetzung von Textvorschlägen bei Geolocation

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 HttpClient
  • das JSON der Antwort kann direkt deserialisiert (halbwegs neue .NET Version vorausgesetzt) werden, der Umweg via string ist nicht nötig
  • statt JArray wäre besser einen eigenen Typ zu haben, zu dem deserialisiert wird

Wenn 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!"