2013-04-09 68 views
0

的集合实现的比较器我有我的课对集合

MyClass<MyTriple<FirstG, SecondG, ThirdG>> : ICollection<MyTriple<FirstG, SecondG, ThirdG>> 

我存储在数据:

Dictionary<FirstG, Dictionary<SecondG, ThirdG>> Data 

,我要实现IEqualityComparer我的数据。的MyClass构造函数取为MyTriple参数比较器:

public MyClass(IEqualityComparer<MyTriple<FirstG, SecondG, ThirdG>> comparer) {...} 

,我想(在某种程度上)这个比较器传递给Data和类似构造函数创建它:

Data = new Dictionary<FirstG, new Dictionary<SecondG, ThirdG>(SecondAndThirdGComparer)>(FirstGComparer); 

我真的很绝望,我尝试创建我的比较器,实现IEqualityComparer,但我想不通,如何得到FirstGComparer<FirstG>比较器。感谢您的任何建议。

+0

请注意,.NET 4包含[Tuple Class](http://msdn.microsoft.com/en-us/library/system.tuple.aspx),这可能会使一些更容易(或至少更多标准)。 – 2013-04-09 17:40:09

+0

它会如何帮助?而不是MyTriple我会有Touple类,比较器的问题仍然存在 – 2013-04-09 17:50:48

+2

我发现你对特定问题过度关注,但由于Framework已经包含了你想要自己构建的东西,可能有可能这个框架Tuple比你的比较友好吗?它可能已经内置了一个比较器;事实上,[我知道它](http://msdn.microsoft.com/en-us/library/dd990083.aspx)。 – 2013-04-09 17:54:28

回答

3

OK,所以用户有型的comparer参数(在构造函数)进来:

IEqualityComparer<MyTriple<FirstG, SecondG, ThirdG>> 

现在,可以在“3D”任何疯狂的比较器。没有人能保证这个comparer以协调方式或词典方式工作。因此,绝对有没有的方式,例如,您可以“比较”只有FirstG的比较器。

假设你有两个实例firstG_XfirstG_Y,说。然后从comparer你不能分辨这两个是否相等。你可以问comparer比较两个三元组只。如果你“扩展”firstG_X到一些三倍,和firstG_Y到其他三倍,你必须作出任意选择,并从不可思议的comparer的答案可能很大程度上取决于该选择。

希望我在说什么是有道理的。

+0

是的,这是我所需要的,所以现在我知道,我必须以不同的方式完成 – 2013-04-09 22:08:53

+0

它可能会有所帮助,具有问题的比较器的特定实际形式。一个常见的比较器是一个数据类型和一个转换为另一个数据的函数,如果它们转换为相同的东西,则它们映射的东西是平等的。例如,可能有一个函数将2d点转换为出现在那里的颜色,如果它们是相同的颜色,则认为点相等。如果x1!= x2和y1!(x1,y1)匹配(x2,y2)与是否存在使得(x1,q)匹配(x2,q)或(q,y1)匹配(q,y2)的任何q无关。 – supercat 2013-04-11 15:44:56

+0

@supercat是的,“xy”平面的任何分区转换为等价类对应于2D中的“IEquialityComparer”。另一个例子,如果'x'是一个人的名字,'y'是该人的出生年份,并且用户给出了一个比较器,如果两个人具有相同的名字,则认为两个人是“平等的”,不管出生年份。然后,从两个出生年份(已知'y1'和'y2'),不可能判断两个人'(?,y1)'和'(?,y2)'是否相等(我们无法猜出他们的名字几年来,检查名称是否匹配)。 – 2013-04-11 15:53:42