LINQ中的条件UNION(或者是比UNION更好的方法)?

时间:2016-05-04 17:19:42

标签: c# linq

我有以下对象模型

public class CityData
{
    public string CityName { get; set; }
    public int IncidentsReported { get; set; }
}

我有一个网络服务方法(我无法改变代码),它为我公司办公室所在的所有城市提供数据。

var data = GetCitiesData();

上述方法仅返回包含事件>的城市。我想要所有城市,不管事件的数量。我尝试使用LINQ Union方法解决我的问题。

var data = GetCitiesData()
                        .Union(
                    new[]
                    {
                        // Add all cities with 0 incidents
                        new CityData() {  CityName = "Kansas City", IncidentsReported = 0},
                        new CityData() {  CityName = "St Louis", IncidentsReported = 0},
                        new CityData() {  CityName = "New York", IncidentsReported = 0},
                    },
                     new CityComparer()
                );

这是我对CityComparer的实现

public class CityComparer : IEqualityComparer<CityData>
{
    public bool Equals(CityData x, CityData y)
    {
        return x.CityName == y.CityName;
    }

    public int GetHashCode(CityData obj)
    {
        return obj.GetHashCode();
    }
}

但我仍然得到LINQ Concat而不是LINQ Union

的结果

有没有更好的方法来解决这个问题?

2 个答案:

答案 0 :(得分:5)

您需要在比较器上将GetHashCodeEquals匹配:

public int GetHashCode(CityData x)
{
    return x.CityName.GetHashCode();
}

答案 1 :(得分:3)

像这样定义GetHashCode方法:

public int GetHashCode(CityData x)
{
    return x.CityName.GetHashCode();
}

在Union调用Equals方法之前,它会检查对象的哈希码,如果它们不同,则Equals方法不会调用。

来自MSDN:

  

如果采用Equals方法,则需要实现以确保   对于两个对象x和y返回true,然后返回由...返回的值   x的GetHashCode方法必须等于为y返回的值。