IEqualityComparer + GroupBy的GetHashCode中的断点未命中

时间:2017-05-16 12:37:38

标签: c# linq iequalitycomparer

代码示例:

 var positions = new List<Position>();

 for (int i = 0; i < 20; i++)
 {
     positions.Add(new Position { Code = "A", Value = i });
     positions.Add(new Position { Code = "A", Value = i });
 }
 var test = positions.GroupBy(p => p, new PositionComparer());

public class Position
{
    public string Code;
    public int Value;
}
public class PositionComparer : IEqualityComparer<Position>
{
    public bool Equals(Position x, Position y)
    {
        return x.Code == y.Code && x.Value == y.Value;
    }
    public int GetHashCode(Position pos)
    {
        unchecked
        {
           int hash = 17;
           hash = hash * 31 + pos.Code.GetHashCode();
           hash = hash * 31 + pos.Value;
           return hash;
         }
     }
 }

我在GetHashCode(以及Equals)中有一个断点 GroupBy期间没有点击断点,为什么不点?

1 个答案:

答案 0 :(得分:0)

来自documentation for GroupBy

  

此方法通过使用延迟执行来实现。立即返回值是一个对象,它存储执行操作所需的所有信息。在通过直接调用其GetEnumerator方法或在Visual C#中使用foreach或在Visual Basic中使用For Each来枚举对象之前,不会执行此方法表示的查询。

除非您在代码中实际使用test执行某项操作,否则分组实际上不会被执行,因此您的PositionComparer也不会被执行。