2010-05-20 5 views
1

J'utilise la classe suivanteCommande Groupe des dossiers

class Country 
{ 
    string CtryID {get; set;} 
    List<City> city {get; set;} 
} 

class City 
{ 
    string county {get; set;}  
    int sqkm {get; set;} 
} 

Je veux commander le résultat comme celui-ci

est Voici quelques exemples de données pour Pays et Ville

Pays

US
UK
Canada

Ville

CITYC
CityF
CITYA
CityB
CityG
CityD
citye

Je veux commander les dossiers par pays, puis la ville (en supposant un certain les villes appartiennent à des pays respectifs) et imprimez-les comme ceci

Canada CITYA CityB citye

UK CityG CityF

US CITYC CityD

et ainsi de suite

+0

Quelle est votre source de données? Une liste de villes? Ou des pays? Il semble étrange que vous n'ayez aucun moyen d'aller d'une ville à l'autre sans vérifier pour chaque pays s'il se trouve dans la liste des villes de ce pays ... –

+0

Aucune liste de pays .. comme ce nouveau pays() {CtryID = "US", cty = new Liste {new Ville() {county = "CityF", sqkm = 2803}, – Gokul

+0

J'ai une liste CountryList countries = new Liste () Si ce n'est pas la bonne façon de faire , alors comment devraient être les classes? – Gokul

Répondre

1

Cela dépend beaucoup de la technologie que vous utilisez pour l'afficher. Par exemple, utilisez-vous un site Web ASP.NET, Windows Forms ou une application de console. Utilisez-vous un outil O/RM ou une collection en mémoire. Voici un exemple d'utilisation en mémoire des objets, avec LINQ, dans une application console:

IEnumerable<Country> countries = GetCountries(); 

foreach (var country in countries.OrderBy(c => c.Name)) 
{ 
    Console.Write(country.Name + " "); 

    foreach (var city in country.Cities.OrderBy(c => c.Name)) 
    { 
     Console.Write(city.Name + " "); 
    } 

    Console.WriteLine(); 
} 

S'il vous plaît noter que j'ai changé votre modèle d'objet pour cela. A a donné Country une propriété Name, a donné City une propriété Name et a renommé la propriété city en Cities.


Vous pouvez aussi le faire:

var countriesNames = 
    from country in countries 
    order by country.Name 
    let cityNames = country.Cities.OrderBy(c => c.Name).ToArray() 
    select new 
    { 
     Name = country.Name 
     Cities = string.Join(" ", cityNames) 
    } 

foreach (var country in countriesNames) 
{ 
    Console.WriteLine(country.Name + " " + country.Cities); 
} 
+0

Ok n'importe quel moyen d'éviter foreach boucle dans LINQ? et l'écrivent comme - de Co dans les pays de ci dans Co.City orderby Co.CtryID, ci.county – Gokul

+0

J'ai mis à jour la réponse et ai ajouté un nouvel exemple qui montre une solution sans l'interne 'foreach'. – Steven

0

Je n'aime pas la structure de votre classe et ce que John Skeet dit dans le commentaire est vrai. Tu devrais l'écouter. Il a une grande réputation.:)

Au moins, vous devez changer à ce qui suit:

class Country 
{ 
    string CtryID {get; set;} 
    List<City> cities {get; set;} 
} 

class City 
{ 
    string CityID {get; set;} 
    int sqkm {get; set;} 

} 

Populate que vous avez dit dans votre commentaire (mais changer à un fichier de base de données ou xml temps):

List<Country> countries = new List<Country> { new Country() { CtryID = "US", cities = new List<City> { new City() { CityID ="CityF", sqkm = 2803 },...etc 

Ensuite, lorsque vous avez un objet graphique peuplé procédez comme suit pour obtenir votre sortie:

countries.ForEach(ctry => { 
    Console.Write(ctry.Name + " "); 
    foreach (var city in ctry.cities) 
    { 
     Console.Write(city.Name + " "); 
    } 
    Console.WriteLine(""); 
}); 
Questions connexes