Ausgabe
Ich möchte eine Zeichenfolge (Postleitzahl, zB: “50000”) mit einem Array von Zeichenfolgenelementen vergleichen, und wenn das Array die angegebene Postleitzahl enthält, muss es die “PSHid” des Arrays auswählen. Ich habe es geschafft, die Json-Datei zu deserialisieren, aber ich stecke nicht fest, wie ich meine Postleitzahlen vergleichen soll. Hier ist mein Code:
using Newtonsoft.Json;
using System.Threading.Tasks;
using System.Net.Http;
namespace ConsoleApp1
{
public class Program
{
static async Task Main(string[] args)
{
string url = "https://raw.githubusercontent.com/kayh1105/msiaPostcodes/main/ShortList_MsiaCitiesPostcodes";
HttpClient httpClient = new HttpClient();
var httpResponseMessage = await httpClient.GetAsync(url);
string jsonResponse = await httpResponseMessage.Content.ReadAsStringAsync();
Console.WriteLine(jsonResponse);
var data = JsonConvert.DeserializeObject<MsiaPostcode>(jsonResponse);
}
}
}
public class MsiaPostcode
{
public _State[] state { get; set; }
}
public class _State
{
public string name { get; set; }
public _City[] city { get; set; }
}
public class _City
{
public string name { get; set; }
public int PSHid { get; set; }
public string[] postcode { get; set; }
}
und unten ist mein Json-Beispiel:
{
"state": [
{
"name": "Wp Kuala Lumpur",
"city": [
{
"name": "Kuala Lumpur",
"PSHid": 1,
"postcode": [
"50000",
"50050"
]
},
{
"name": "Setapak",
"PSHid": 2,
"postcode": [
"53300"
]
}
]
},
{
"name": "Johor",
"city": [
{
"name": "Ayer Baloi",
"PSHid": 3,
"postcode": [
"82100"
]
},
{
"name": "Ayer Hitam",
"PSHid": 4,
"postcode": [
"86100"
]
},
{
"name": "Yong Peng",
"PSHid": 5,
"postcode": [
"83700",
"83710"
]
}
]
}
]
}
Lösung
Reduzieren Sie zuerst die Liste der Bundesstaaten ( Viele-zu-Viele-Beziehung : Viele Bundesstaaten, jeder Bundesstaat kann mehrere Städte haben) in eine Liste von Städten.
Nachdem Sie die Liste der Städte erhalten haben, filtern Sie nach Postleitzahl,
Um die Liste der Liste in eine sequenzielle Liste zu reduzieren
SelectMany(): Projiziert jedes Element einer Sequenz auf ein IEnumerable und glättet die resultierenden Sequenzen zu einer Sequenz.
var PSHids = data.state
.SelectMany(x => x.city) //Convert list of states into list of cities
.Where(x => x.postcode.Contains("50000"))) //Filter by postcode
.Select(x => x.PSHid) //Select PSHid property only
.ToList(); //Convert IEnumerable<int> to List<int>
Beantwortet von – Prasad Telkikar
Antwort geprüft von – Mary Flores (FixError Volunteer)