LINQ中的条件UNION(或者有比UNION更好的方法吗)



我有以下对象模型

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

我有一种网络服务方法(我不能更改代码),它可以为我提供公司办公室所在的所有城市的数据。

var data = GetCitiesData();

上述方法仅返回偶发事件>0的城市。但我想要所有的城市,不管事故数量。我试图使用LINQ联合方法来解决我的问题。

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 的结果

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

您需要在比较器上匹配GetHashCodeEquals

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

这样定义GetHashCode方法:

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

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

来自MSDN:

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

最新更新