首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IEqualityComparer含义

IEqualityComparer含义
EN

Stack Overflow用户
提问于 2010-02-26 15:11:50
回答 1查看 1.3K关注 0票数 0

考虑一下这个数组

代码语言:javascript
复制
        string[] presidents = {
            "Adams", "Arthur", "Buchanan", "Bush", "Carter", "Cleveland",
            "Clinton", "Coolidge", "Eisenhower", "Fillmore", "Ford", "Garfield",
            "Grant", "Harding", "Harrison", "Hayes", "Hoover", "Jackson",
            "Jefferson", "Johnson", "Kennedy", "Lincoln", "Madison", "McKinley",
            "Monroe", "Nixon", "Pierce", "Polk", "Reagan", "Roosevelt", "Taft",
            "Taylor", "Truman", "Tyler", "Van Buren", "Washington", "Wilson"};

我的分组标准是名称在一个组中,长度为1到5,并保留在另一个组中。

我使用这个派生类实现了这一点

代码语言:javascript
复制
class MyLengthComparer:IEqualityComparer<Int32>
{
    public Int32 GetHashCode(Int32 i)
    {
        return i<=5?1:6;
    }


    public Boolean Equals(Int32 i1,Int32 i2)
    {
        if(i1<=5 && i2<=5)
            return true;
        if(i1>5 && i2>5)
            return true;
        else
            return false;
    }
}

现在我运行这个

代码语言:javascript
复制
        IEnumerable<IGrouping<Int32, String>> groupVar = presidents.GroupBy(prez=>prez.Length,new MyLengthComparer());
        foreach(IGrouping<Int32, String> grp in groupVar)
        {
            Console.WriteLine("******" + grp.Key + "******" );
            foreach(String name in grp)
                Console.WriteLine(name);
        }

        Console.ReadKey();

我想知道IEqualityInterface2个函数的含义,我的意思是比较是如何进行的。

Key在IGrouping中的意义是什么?为什么会显示5和6?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-02-26 15:16:22

它显示5和6,因为组的密钥被认为是从第一项创建的密钥。"Adams“的长度是5,"Arthur”的长度是6,所以这是组的关键字。

对于一个组来说,关键是组中的所有东西都有什么共同点。你的比较器在这方面是相当奇怪的。

基本上,序列中的每个元素都被投影到键(名称的长度),然后进行查找,以确定该键是否已经有一个组。该查找需要散列代码(因为它是基于散列的查找)和相等-而这正是您的自定义比较器所提供的。它根据长度给出1或6的散列(实际数字相对不重要;它们是一致的,这意味着查找将会工作,而它们是不同的,这意味着它将是有效的)。相等函数本身实际上就是“这两个值在小于或等于5方面是否相同”。我可能会这样实现它:

代码语言:javascript
复制
public Boolean Equals(Int32 i1,Int32 i2)
{
    return (i1 <= 5) == (i2 <= 5);
}

这实际上更明显的是,通过使用x => x.Name.Length <= 5的键投影而不提供自定义比较器,您将获得相同的分组(诚然,具有不同的键):

代码语言:javascript
复制
var groups = presidents.GroupBy(prez => prez.Length <= 5);
foreach(var group in groups)
{
    // This time the key will be true or false
    Console.WriteLine("******" + group.Key + "******" );
    foreach(String name in group)
    {
        Console.WriteLine(name);
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2340011

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档