2013-07-05 22 views
10

LINQ Lambda Expression/Statemene Expression kullanarak "// Ekranı Foreach kullanarak" döngü uygulamasını nasıl yazarım?C# Dictionary kullanarak bir C# Dictionary işleniyor LINQ

Gelişimimi basitleştirmek ve yuvalanmış foreach döngülerinden mümkün olduğunca kaçınmak istiyorum. İkinci foreach ifadesinde daha fazla mantık eklemeye çalışıyorum ve Lambda/Statement ifadesini kullanmak istiyorum.

internal class Program 
{ 
    internal class Country 
    { 
     public string CountryName { get; set; } 
     public int CountryCode { get; set; } 
    } 
    static void Main(string[] args) 
    { 
     List<Country> countries = new List<Country>() 
     { 
      new Country{CountryName = "India", CountryCode=1}, 
      new Country{CountryName = "Andaman Nicobar", CountryCode=1}, 
      new Country{CountryName = "United States of America", CountryCode=2}, 
      new Country{CountryName = "Alaska", CountryCode=2}, 
      new Country{CountryName = "Hawaii", CountryCode=2}, 
      new Country{CountryName = "United Kingdom", CountryCode=3}, 
      new Country{CountryName = "Australia", CountryCode=4} 
     }; 

     Dictionary<int, List<Country>> countriesDictionary = new Dictionary<int, List<Country>>(); 
     foreach (Country country in countries) 
     { 
      if (!countriesDictionary.ContainsKey(country.CountryCode)) 
       countriesDictionary.Add(country.CountryCode, new List<Country>()); 
      countriesDictionary[country.CountryCode].Add(country);     
     } 

     // Display using Foreach 

     foreach (int key in countriesDictionary.Keys) 
     {        
      List<Country> dCountries = countriesDictionary[key]; 

      foreach (Country country in dCountries) 
      { 
       if (country.CountryCode.Equals(key)) 
       { 
        Console.WriteLine(country.CountryName); 
       }     
      } 
      Console.WriteLine();    
     } 
     Console.ReadLine(); 
    } 

Lütfen öneriniz.

+5

Zaten ülkelerdictionary 'sözlüğüne filtrelenmiş ülkeleriniz var, neden iç içe döngü içinde "dCountries" içinde arama yapıyorsunuz? –

cevap

5

Ülkeleri kodla gruplandırmak istiyorsanız, iki sözlüke ihtiyacınız yoktur. Enumerable.GroupBy

foreach(var codeGroup in countries.GroupBy(c => c.CountryCode)) 
{ 
    foreach(var country in codeGroup) 
     Console.WriteLine(country.CountryName); 

    Console.WriteLine(); 
} 

kullanın Ya da sadece countriesDictionary (zaten ülkeler kodu tarafından gruplandırılmış olan) kullanın:

foreach(var kvp in countriesDictionary) 
{ 
    foreach(var country in kvp.Value) 
     Console.WriteLine(country.CountryName); 

    Console.WriteLine(); 
} 
10

Bu da başka bir alternatiftir: Ayrıca

countriesDictionary.ToList().ForEach 
(
    pair => 
    { 
     pair.Value.ForEach(country => Console.WriteLine(country.CountryName)); 
     Console.WriteLine(); 
    } 
); 

, bu bir Romoku's Answer (a nswer) kaldırıldı: ...

var countriesDictionary = countries.ToLookup(x => x.CountryCode, x => x); 

var dCountries = new List<Country>(); 

foreach(var countryGroup in countriesDictionary) 
{ 
    foreach(var country in countryGroup) 
    { 
     Console.WriteLine(country.CountryName); 
    } 
    Console.WriteLine(); 
} 
1

Ya da sadece ... zaten, zaten ülke kodu ile Gruplaşıyorlar belirtildiği gibi çok kolay hale

 foreach (var country in countriesDictionary.SelectMany(pair => pair.Value)) 
     { 
      Console.WriteLine(country.CountryName); 
     } 
Yapacak bir uzantısını kullanacak
0

o.

static class CountryExtension 
    { 
     public static void WriteCountriesGroupyCountryCode(this IEnumerable<Country> list) 
     { 
      int currentCountry=int.MinValue; 
      list.OrderBy(c => c.CountryCode).ThenBy(c=>c.CountryName).ToList().ForEach(c => 
      { 
       if (currentCountry == int.MinValue) 
       { 
        currentCountry = c.CountryCode; 
       } 
       else if (currentCountry != c.CountryCode) 
       { 
        Console.WriteLine(); 
        currentCountry = c.CountryCode; 
       } 
       Console.WriteLine(c.CountryName); 
      }); 
     } 
    } 
1

bir yolu belirtilen kodla her ülkenin adını yazdırmak için, sadece 1 foreach mantığı GroupBy ilk foreach kaçınarak, bu gibi olabilir:

Dictionary<int, List<Country>> countriesDictionary = countries.GroupBy(g => g.CountryCode).ToDictionary(k => k.Key, k => k.ToList()); 

foreach (int key in countriesDictionary.Keys) 
{ 
     Console.WriteLine("****Countries with code {0}****",key); 
     int count = 0; 
     while (count < countriesDictionary[key].Count) 
     { 
      Console.WriteLine(countriesDictionary[key][count].CountryName); 
      count++; 
     } 
     Console.WriteLine(); 
} 

Console.ReadLine(); 
1

muhtemelen yeterli cevaplar var olsa Bu LINQ, sözlüğünüzü bir ülke isimleri listesi halinde sıkıştırarak, kolay bir foreach görüntülenmesini sağlar.

List<string> countryNames = countriesDictionary.SelectMany(
     pair=>pair.Value.Where(
      country=>country.CountryCode == pair.Key 
     ).Select(x=>x.CountryName)).ToList(); 

    foreach (var name in countryNames) 
     Console.WriteLine(name); 

Ancak, Sözlüğünüzün ayarlandığı yol, anahtarın her zaman ülke kodlarıyla değerin eşleşmesi gerekir, doğru mu?

İlgili konular