2015-03-19 4 views
2

У меня есть следующие три класса;Получить отличительные родительские элементы, используя Lambda

public class City 
{ 
    public int CityId { get; set; } 
    public Region Region { get; set; } 
    public string Name { get; set; } 
} 

public class Region 
{ 
    public int RegionId { get; set; } 
    public Country Country { get; set; } 
    public string Name { get; set; } 
} 

public class Country 
{ 
    public string CountryCode { get; set; } 
    public string Name { get; set; } 
} 

Я заполнил объект City List, чтобы содержать ряд городов, каждый из которых имеет регион и страну.

Теперь я хочу получить список всех стран для всех городов. Я пробовал следующее:

List<City> CityObjectList = GetAllCity(); 
CityObjectList.Select(r => r.Region).ToList().Select(c => c.Country).ToList(); 

Однако все, что я получаю, это все страны. Как я могу получить отдельные страны?

+0

_ «Заселен объект« Город », чтобы содержать ряд городов» _ Я не вижу коллекцию в «Сити». –

+0

Я обновил свой вопрос. – Tommassiov

+1

. Может быть, (возможно)? – Ahmad

ответ

3

Вы можете использовать:

var allCityCountries = CityObjectList.Select(c => c.Region.Country).ToList(); 

Этот список не отличается. Для того, чтобы страны уникальным можно либо переопределить Equals + GetHashCode в Country, реализовать пользовательские IEqualityComparer<Country> для Enumerable.Disinct или использовать GroupBy (медленный, но самый простой вариант):

var distinctCountries = CityObjectList 
    .Select(c => c.Region.Country) 
    .GroupBy(c => c.CountryCode) 
    .Select(g => g.First()) 
    .ToList(); 

IEqualityComparer<T> путь:

class CountryCodeComparer : IEqualityComparer<Country> 
{ 
    public bool Equals(Country x, Country y) 
    { 
     if(object.ReferenceEquals(x, y)) return true; 
     if(x == null || y == null) return false; 
     return x.CountryCode == y.CountryCode; 
    } 

    public int GetHashCode(Country obj) 
    { 
     return obj == null ? 0 : obj.CountryCode == null ? 0 : obj.CountryCode.GetHashCode(); 
    } 
} 

сейчас вы можете использовать Distinct с указанием его:

var comparer = new CountryCodeComparer(); 
distinctCountries = CityObjectList.Select(c => c.Region.Country).Distinct(comparer).ToList(); 
+0

Работал отлично, используя ваш пример GroupBy. Спасибо. – Tommassiov

Смежные вопросы