我有以下对象模型
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
的结果有没有更好的方法来解决这个问题?
答案 0 :(得分:5)
您需要在比较器上将GetHashCode
与Equals
匹配:
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返回的值。