【发布时间】:2013-07-22 00:32:47
【问题描述】:
我决定检查一个函数中的类型,而不是重载一个函数 100 次或为不同类型创建 100 个不同的比较器。
例如,我使用默认比较器来比较 2 个对象内的一组类型(基元和字符串)的值。它包含以下代码:
public class DefComparer : IComparer<object> {
public int Compare(object a, object b) {
.... // a = a.GetType().GetField(field).GetValue(a); - not important for the question but I'm just showing that a&b below are different references
switch (a.GetType().Name) {
case "Byte":
if ((byte)a == (byte)b) return 0;
else if ((byte)a > (byte)b) return 1;
else return -1;
case "UInt16":
if ((ushort)a == (ushort)b) return 0;
else if ((ushort)a > (ushort)b) return 1;
else return -1;
case "SByte":
if ((sbyte)a == (sbyte)b) return 0;
else if ((sbyte)a > (sbyte)b) return 1;
else return -1;
case "Int16":
...
这里我使用了switch 语句,据说它比if/else 语句链更快。但是a.GetType().Name返回的是一个动态获取的字符串,这个方法涉及到字符串比较。这对我来说听起来不是特别快。我需要比较器在技术上尽可能快,因为它将用于大量数据集合。
问:有没有更快的方法来检查对象的类型(不涉及字符串比较)?最快的方法是什么?
【问题讨论】:
-
您正在寻找
Comparer.Default。 -
或者调用 ((IComparable)a).CompareTo(b)
-
不,我不是在寻找
Comparer.Default。我已经编辑了我的帖子以使其更加清晰。我的问题是关于检查类型的快速方法。 -
这些是混合类型的大型集合,还是单一类型但类型未知的大型组?
-
@usr 不确定这是否更快,但我会检查一下。
标签: c# performance reflection types