using System.Collections.Generic;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using Newtonsoft.Json.Converters;
using System.Globalization;
public class GenderGuess{
private string precision = "0.00" ;
[JsonConverter(typeof(StringEnumConverter))]
public Gender Gender { get; set; }
[JsonProperty("probability")]
public float GenderProbability { get; set; }
public override string ToString() =>
$"Gender: {this.Gender}, probability: {this.GenderProbability.ToString(precision)}";
public static GenderGuess UnknowGender() {
var @new = new GenderGuess();
@new.Gender = Gender.Undefined;
@new.GenderProbability = 0;
public class CountryGuess{
private string precision = "0.0000" ;
[JsonProperty("country_id")]
public string Country_id { get; set; }
[JsonProperty("probability")]
public float CountryProbability { get; set; }
public override string ToString() =>
$"Country ID: {this.Country_id}, probability: {this.CountryProbability.ToString(precision)}";
public class GuessAboutName {
private string newLine = Environment.NewLine;
private string newLineWithComma = ", " + Environment.NewLine;
public string Name { get; }
public bool NeededToRemoveDiacritics { get; set; }
public GenderGuess Gender { get; set; }
public int Age { get; set; }
public List<CountryGuess> PossibleCountries { get; set; }
public GuessAboutName(string name) { Name = name; }
public override string ToString() =>
$@"For original name {Name}:
Need to remove diacritics? {(this.NeededToRemoveDiacritics ? ("yes (" + this.Name.RemoveDiacritics() + ")") : "no")};
Age: {this.Age.ToString()} years
PossibleCountries: {newLine +
string.Join(newLineWithComma, PossibleCountries)}";
public static async Task Main()
await ProcessName("Márcelo");
Console.WriteLine("#######################################################");
await ProcessName("Ariadna");
public static async Task ProcessName(string name){
string urlParameters = $"?name={name}";
var guess = new GuessAboutName(name);
guess.NeededToRemoveDiacritics = false;
#region NeedNameParameter
string[]URLs = new[]{ "https://api.genderize.io", urlParameters, "https://api.agify.io", urlParameters, "https://api.nationalize.io", urlParameters };
for (int i=0; i<URLs.Length; i++)
var response = await GetResponse(URLs[i], URLs[i+1]);
if (URLs[i].Contains("https://api.genderize.io"))
var gender = GenderGuess.UnknowGender();
dynamic dobj = JsonConvert.DeserializeObject<dynamic>((response.Content.ReadAsStringAsync()).Result);
var count = dobj["count"];
gender = JsonConvert.DeserializeObject<GenderGuess>((response.Content.ReadAsStringAsync()).Result);
guess.NeededToRemoveDiacritics= true;
response = await GetResponse(URLs[i], URLs[i+1].RemoveDiacritics());
gender = JsonConvert.DeserializeObject<GenderGuess>((response.Content.ReadAsStringAsync()).Result);
else if (URLs[i].Contains("https://api.nationalize.io"))
dynamic dobj = JsonConvert.DeserializeObject<dynamic>((response.Content.ReadAsStringAsync()).Result);
guess.PossibleCountries = JsonConvert.DeserializeObject<List<CountryGuess>>(dobj["country"].ToString());
foreach (var country in guess.PossibleCountries)
dynamic dobj = JsonConvert.DeserializeObject<dynamic>((response.Content.ReadAsStringAsync()).Result);
var count = dobj["count"];
guess.NeededToRemoveDiacritics= true;
response = await GetResponse(URLs[i], URLs[i+1].RemoveDiacritics());
dobj = JsonConvert.DeserializeObject<dynamic>((response.Content.ReadAsStringAsync()).Result);
Console.WriteLine(guess.ToString());
#endregion NeedNameParameter
public static void PrettyPrintResponse(HttpResponseMessage response)
if (response.IsSuccessStatusCode)
response.StatusCode.Dump();
(response.Content.ReadAsStringAsync()).Result.Dump();
Console.WriteLine("{0} ({1})", (int)response.StatusCode, response.ReasonPhrase);
public static async Task<HttpResponseMessage> GetResponse(string URL, string urlParameters)
using(var client = new HttpClient())
client.BaseAddress = new Uri(URL);
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
return await client.GetAsync(urlParameters);
public static class Utils {
public static string RemoveDiacritics(this string str)
if (null == str) return null;
.Normalize(NormalizationForm.FormD)
.Where(c=> CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark)
return new string(chars).Normalize(NormalizationForm.FormC);