Linq独特不调用等于方法

拉斯姆斯·汉森(Rasmus Hansen)

我有以下课程

public class ModInfo : IEquatable<ModInfo>
{
    public int ID { get; set; }
    public string MD5 { get; set; }

    public bool Equals(ModInfo other)
    {
        return other.MD5.Equals(MD5);
    }

    public override int GetHashCode()
    {
        return MD5.GetHashCode();
    }
}

我使用如下方法将一些数据加载到该类的列表中:

public void ReloadEverything() {
    var beforeSort = new List<ModInfo>();
    // Bunch of loading from local sqlite database. 
    // not included since it's reload boring to look at
    var modinfo = beforeSort.OrderBy(m => m.ID).AsEnumerable().Distinct().ToList();
}

问题在于Distinct()电话似乎并没有发挥作用。仍然存在彼此相等的对象。

根据这篇文章:https ://msdn.microsoft.com/en-us/library/vstudio/bb348436%28v=vs.100%29.aspx这是您应该做的不同工作的方式,但事实并非如此似乎在ModInfo对象上调用Equals方法。是什么导致这种情况发生?

值示例:

modinfo[0]: id=2069, MD5 =0AAEBF5D2937BDF78CB65807C0DC047C
modinfo[1]: id=2208, MD5 = 0AAEBF5D2937BDF78CB65807C0DC047C

我不在乎选择哪个值,因为md5值相同,所以它们可能总是相同的。

弗雷德·克留佛(Fred Kleuver)

您还需要重写Object.Equals,而不仅仅是实现IEquatable

如果将此添加到您的班级:

public override bool Equals(object other)
{
    ModInfo mod = other as ModInfo;
    if (mod != null)
        return Equals(mod);
    return false;
}

它应该工作。

有关更多信息,请参见本文:正确实现IEquatable

编辑:好的,这是基于最佳实践GetHashCode的稍微不同的实现。

public class ModInfo : IEquatable<ModInfo>
{
    public int ID { get; set; }
    public string MD5 { get; set; }

    public bool Equals(ModInfo other)
    {
        if (other == null) return false;
        return (this.MD5.Equals(other.MD5));
    }

    public override int GetHashCode()
    {
        unchecked
        {
            int hash = 13;
            hash = (hash * 7) + MD5.GetHashCode();
            return hash;
        }
    }

    public override bool Equals(object obj)
    {
        ModInfo other = obj as ModInfo;
        if (other != null)
        {
            return Equals(other);
        }
        else
        {
            return false;
        }
    }
}

您可以验证它:

ModInfo mod1 = new ModInfo {ID = 1, MD5 = "0AAEBF5D2937BDF78CB65807C0DC047C"};
ModInfo mod2 = new ModInfo {ID = 2, MD5 = "0AAEBF5D2937BDF78CB65807C0DC047C"};

// You should get true here
bool areEqual = mod1.Equals(mod2);

List<ModInfo> mods = new List<ModInfo> {mod1, mod2};

// You should get 1 result here
mods = mods.Distinct().ToList();

GetHashCode中的那些特定数字是什么?

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

IEquatable不调用等于方法

来自分类Dev

CCButton不调用方法

来自分类Dev

NSURLSession方法不调用

来自分类Dev

不调用HttpPost方法

来自分类Dev

异步方法不调用

来自分类Dev

Swift方法:不调用deinit

来自分类Dev

Distinct()不调用equals方法

来自分类Dev

分段控件不调用方法

来自分类Dev

<h:commandButton>不调用方法

来自分类Dev

JAXB不调用Setter方法

来自分类Dev

XMLParser不调用委托方法

来自分类Dev

NSSplitViewController不调用委托方法

来自分类Dev

Distinct()不调用equals方法

来自分类Dev

AVAudioPlayerDelegate不调用该方法

来自分类Dev

UIImagePickerController不调用委托方法

来自分类Dev

调用子类方法而不调用父类

来自分类Dev

测试Remove方法而不调用Add方法

来自分类Dev

线程启动而不调用它的启动方法

来自分类Dev

可可NSCollectionView不调用dataSource方法

来自分类Dev

UIPanGestureRecognizer永不调用操作方法

来自分类Dev

Django不调用模型清理方法

来自分类Dev

JavaFX不调用main(String [] args)方法

来自分类Dev

为什么不调用种子方法?

来自分类Dev

为什么不调用此方法就执行?

来自分类Dev

不调用close方法可以吗?

来自分类Dev

为什么不调用UIViewControllerTransitioningDelegate的方法presentationControllerForPresentedViewController?

来自分类Dev

C#反射不调用方法

来自分类Dev

使用扩展方法而不调用类名

来自分类Dev

方法被执行而不调用它?