在.NET中,似乎有两种方法可以将类型传递给方法或类.第一种是通过泛型,我们将类型作为特殊参数传递.
如:
var list = new List<MyClass>();
Run Code Online (Sandbox Code Playgroud)
另一种方法是明确使用typeof运算符,例如:
var pe = Expression.ParameterExpression(typeof(MyClass), "myinstance");
Run Code Online (Sandbox Code Playgroud)
我的问题是关于需要类型参数的方法的统一接口的差异.为什么上述陈述不能如下做?:
var pe = Expression.ParameterExpression<MyClass>("myinstance");
Run Code Online (Sandbox Code Playgroud)
是因为编译器的行为方式需要两个语义差异吗?当编译器处理泛型参数时,它只是执行替换ala lambda演算吗?尽管typeof风格方法要求的实际实例Type类来推断属性和特性?
谢谢.
我通过运行一些xml结构动态生成正则表达式,并在我查看其节点类型时构建语句.我正在使用此正则表达式作为我定义的布局类型的一部分.然后我解析一个文本文件,在每行的开头有一个Id.这个id指向我一个特定的布局.然后我尝试将该行中的数据与其正则表达式进行匹配.
听起来不错,花花公子吧?唯一的问题是匹配字符串非常慢.我把它们设置为编译,以尝试加快速度,但无济于事.令人困惑的是,这些表达方式并不复杂.我绝不是一个正则表达式的大师,但我知道一个体面的关于他们的量把事情顺利.
这是生成表达式的代码......
StringBuilder sb = new StringBuilder();
//get layout id and memberkey in there...
sb.Append(@"^([0-9]+)[ \t]{1,2}([0-9]+)");
foreach (ColumnDef c in columns)
{
sb.Append(@"[ \t]{1,2}");
switch (c.Variable.PrimType)
{
case PrimitiveType.BIT:
sb.Append("(0|1)");
break;
case PrimitiveType.DATE:
sb.Append(@"([0-9]{2}/[0-9]{2}/[0-9]{4})");
break;
case PrimitiveType.FLOAT:
sb.Append(@"([-+]?[0-9]*\.?[0-9]+)");
break;
case PrimitiveType.INTEGER:
sb.Append(@"([0-9]+)");
break;
case PrimitiveType.STRING:
sb.Append(@"([a-zA-Z0-9]*)");
break;
}
}
sb.Append("$");
_pattern = new Regex(sb.ToString(), RegexOptions.Compiled);
Run Code Online (Sandbox Code Playgroud)
实际的慢节......
public System.Text.RegularExpressions.Match Match(string input)
{
if (input == null)
throw new ArgumentNullException("input");
return _pattern.Match(input);
}
Run Code Online (Sandbox Code Playgroud)
典型的"_pattern"可能有大约40-50列.我将不会粘贴整个模式.我尝试对每个案例进行分组,以便稍后我可以在Match对象中枚举每个案例.
任何可以提供极大帮助的提示或修改?或者这种情况会慢慢发挥作用?
编辑清晰度:对不起,我认为我第一次不够清楚.
我使用xml文件为特定布局生成正则表达式.然后我运行一个文件进行数据导入.我需要确保文件中的每一行都匹配它应该是的模式.因此,可以多次检查模式,可能是数千次.
我已经成为一名C#程序员,总共大约2年,而且专业性超过1.我作为开发人员在一家公司工作,开始于.NET 2之前的应用程序.我的问题是:
使用数据绑定从sql查询直接到控件查询和手动添加项目到控件有什么好处?这种方法通常被认为是更清洁,在部署方面更简单吗?是否仍会出现手动添加会对数据的显示/值进行更精细控制的情况?
我问,因为我已经分配了一些错误来处理一些根据查询结果填充自己的控件,并且希望清理不必要的逻辑并将其推送到库来处理而不是我.
注意:我们使用的是.NET 2.0
在我工作的地方,我们终于开始使用强类型数据集将一些查询封装到sqlserver.我一直在吹嘘的一个想法是强类型列的强度,主要是因为不需要转换任何数据.我认为强类型数据集会在以下可能存在数千行的情况下提高性能,这是错误的吗?
旧方式:
using(DataTable dt = sql.ExecuteSomeQuery())
{
foreach (DataRow dr in dt.Rows)
{
var something = (string)dr["something"];
var somethingelse = (int)dr["somethingelse"];
}
}
Run Code Online (Sandbox Code Playgroud)
新方法:
MyDataAdapter.Fill(MyDataset);
foreach (DataRow dr in MyDataset.MyDT.Rows)
{
var something = dr.Something;
var somethingelse = dr.SomethingElse;
}
Run Code Online (Sandbox Code Playgroud)
如果属性真的只是在幕后进行投射,我可以看到根本不会有任何加速; 或许它需要更长的时间才能获得函数调用的开销.
使用我们应该了解的DataSet还有其他任何性能优势/劣势吗?
谢谢!
我的一位同事想到了一种很好的方法来可视化我们在用户端应用程序中使用的大量数据,但是我们并没有意识到许多可用的sdk或api.
我们试图重新创造CNN的"魔力墙".我们希望能够以"热图"的方式显示全国各地的趋势,并能够深入到一个州,以显示各县的相同趋势.我们不需要评论员喜欢使用的移动状态 - 所有就地功能.
我们知道Mappoint,但如果能够满足我们的要求,还需要做更多的研究.
试着滚动我们自己更有意义吗?有没有人尝试过这些方面的东西?我能看到的唯一问题是为每个州定义边界,或者在州一级定义县.
思考?想法?
.net ×5
c# ×4
performance ×2
data-binding ×1
dataset ×1
generics ×1
gis ×1
mapping ×1
regex ×1
sql-server ×1
typeof ×1
xml ×1