检查类型的最快方法是什么
本文关键字:方法 是什么 类型 检查 | 更新日期: 2023-09-27 18:24:03
我决定在一个函数中检查类型,而不是重载一个函数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在技术上尽可能快,因为它将用于大型数据集。
Q: 有没有一种更快的方法来检查对象的类型(不涉及字符串比较)?最快的方法是什么
好吧,你已经掌握了。使用TypeCode
int a = 10;
Type t = a.GetType();
switch (Type.GetTypeCode(t))
{
case TypeCode.Boolean:
break;
case TypeCode.Byte:
break;
case TypeCode.Char:
break;
case TypeCode.DBNull:
break;
case TypeCode.DateTime:
break;
case TypeCode.Decimal:
break;
case TypeCode.Double:
break;
case TypeCode.Empty:
break;
case TypeCode.Int16:
break;
case TypeCode.Int32:
break;
case TypeCode.Int64:
break;
case TypeCode.Object:
break;
case TypeCode.SByte:
break;
case TypeCode.Single:
break;
case TypeCode.String:
break;
case TypeCode.UInt16:
break;
case TypeCode.UInt32:
break;
case TypeCode.UInt64:
break;
default:
break;
}
这支持所有基元。对于自定义对象,在TypeCode.Object
中写入else if
语句。
我希望这能有所帮助。
从注释中,听起来好像有一堆结构化数据,其中包含不同类型的子对象。
如果集合很大,最快的方法将是动态代码生成(可能带有表达式树)来创建一个方法,该方法以强类型的方式提取所有感兴趣的字段/属性,并执行强类型比较。
基本上,您可以使用反射从集合成员类型中动态获取字段/属性类型。然后构建MemberAccessExpression
表达式,将这些表达式传递给Expression.Equal
,并将所有结果传递给Expression.AndAlso
。编译表达式将为您提供一个委托,该委托接受集合中包含的两个特定类型的对象。
启动时间将比您在问题中显示的代码慢几个数量级,但每个对象的成本将低得多。你必须进行测试,看看盈亏平衡点在哪里——但可能在几千点以下。