Linq组查询给出了错误的结果

时间:2015-03-17 15:32:36

标签: c# linq linq-group

我在使用C#项目中的group by子句执行Linq查询时遇到一些问题,如下所示:

public class Stock {
    public string Name {get; set;}
    public List<int> Values {get; set;}
    public float Price {get; set;}
}

// Stock collection
List<Stock> stocks = new List<Stock>()
{
    new Stock(){Name="Prod1", Values=new List<int>{1, 2, 3, 0}, Price=5.0f, 
    new Stock(){Name="Prod1", Values=new List<int>{1, 2, 3, 0}, Price=5.0f,
    new Stock(){Name="Prod11", Values=new List<int>{1, 0, 3, 1}, Price=8.0f,
    new Stock(){Name="Prod11", Values=new List<int>{1, 0, 3, 1}, Price=8.0f,
    new Stock(){Name="Prod18", Values=new List<int>{0, 0, 4, 1}, Price=4.5f,
    new Stock(){Name="Prod20", Values=new List<int>{4, 0, 0, 2}, Price=9.9f,
    new Stock(){Name="Prod20", Values=new List<int>{4, 0, 0, 2}, Price=9.9f,
    new Stock(){Name="Prod29", Values=new List<int>{2, 1, 0, 1}, Price=7.2f,
};

var query = stocks.GroupBy(x => x, (x, g) => new { Count = g.Count(), Values = x}).ToList();

此查询会产生错误的分组结果。

1 个答案:

答案 0 :(得分:2)

为了使GroupBy生成分组,您分组的对象必须覆盖GetHashCodeEquals,或者您需要提供适当的相等比较器{ {1}}。

您的GroupBy未覆盖Stock / GetHashCode,而您的Equals查询未使用自定义相等比较器,因此您会收到意外结果。

提供合适的覆盖将解决此问题:

GroupBy

Demo.