最简单的解决方案是确保您的关键函数返回数字或字符串。但如果你真的想返回一个对象作为你的键,那么你可以使用comparer
and hashCode
帮助groupBy
。代替hashCode
(这需要您返回一个数字),您可以使用valueOf
它可以让你返回一个字符串。
hashCode
and valueOf
应该类似于时间:2019-03-17 标签:c#Object.GetHashCode http://msdn.microsoft.com/en-us/library/system.object.gethashcode(v=vs.110).aspx.
他们应该返回一个值,使得:
- 被认为相等的两个键每次都应该返回相同的值。
- 被认为不相等的两个键通常应返回不同的值(以最大限度地减少冲突)。你越能确保这一点,词典的效率就越高。
区别在于hashCode
应该返回一个数字并且valueOf
可以返回一个数字或一个字符串。因此valueOf
更容易实施。
规则为comparer
是它需要 2 个键值并且应该返回true
来表示平等和false
来表示不平等。
因此,您可以将示例编写为:
var valueOf = function () {
return JSON.stringify(this);
};
var keyCompare = function (a, b) { return a.x === b.x && a.y === b.y; };
var types = stream.groupBy(
function (e) {
return { x: e.x, y: e.y, valueOf: valueOf }; //is this valid at all?
},
function (e) { return e; },
keyCompare);
但如果你的valueOf
函数实际上会生成与比较器匹配的唯一值,并且您并不真正关心密钥是否作为实际对象传输到下游,然后让您的生活更轻松,并将密钥转换为字符串并使用字符串密钥,如下所示:
var types = stream.groupBy(
function (e) { return JSON.stringify({ x: e.x, y: e.y }); },
function (e) { return e; });