代码示例:

 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期间没有命中断点,为什么不呢?

最佳答案

documentation for GroupBy


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


除非您实际上在代码中对test进行了操作,否则实际上不会执行分组操作,因此您的PositionComparer也不会得到执行。

关于c# - IEqualityComparer + GroupB的GetHashCode中的断点未命中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44001698/

10-10 10:59