使用Lambda获取不同的父项

时间:2015-03-19 13:48:39

标签: c# linq list lambda distinct

我有以下三个类别;

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; }
}

我已填充城市列表对象以包含多个城市,每个城市都有一个区域和一个国家/地区。

现在我想获得所有城市的所有国家的列表。我尝试了以下内容;

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

然而,我回来的只是所有国家。我怎样才能获得不同的国家?

1 个答案:

答案 0 :(得分: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();