考虑一下这个数组
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,并保留在另一个组中。
我使用这个派生类实现了这一点
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;
}
}现在我运行这个
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?
发布于 2010-02-26 15:16:22
它显示5和6,因为组的密钥被认为是从第一项创建的密钥。"Adams“的长度是5,"Arthur”的长度是6,所以这是组的关键字。
对于一个组来说,关键是组中的所有东西都有什么共同点。你的比较器在这方面是相当奇怪的。
基本上,序列中的每个元素都被投影到键(名称的长度),然后进行查找,以确定该键是否已经有一个组。该查找需要散列代码(因为它是基于散列的查找)和相等-而这正是您的自定义比较器所提供的。它根据长度给出1或6的散列(实际数字相对不重要;它们是一致的,这意味着查找将会工作,而它们是不同的,这意味着它将是有效的)。相等函数本身实际上就是“这两个值在小于或等于5方面是否相同”。我可能会这样实现它:
public Boolean Equals(Int32 i1,Int32 i2)
{
return (i1 <= 5) == (i2 <= 5);
}这实际上更明显的是,通过使用x => x.Name.Length <= 5的键投影而不提供自定义比较器,您将获得相同的分组(诚然,具有不同的键):
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);
}
}https://stackoverflow.com/questions/2340011
复制相似问题