我有以下对象模型
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 的结果
有更好的方法来解决这个问题吗?
您需要在比较器上匹配GetHashCode
和Equals
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返回的值。