我有一Dictionary<string, object>
本字典.它曾经是,Dictionary<Guid, object>
但其他"标识符"已经发挥作用,键现在作为字符串处理.
问题是Guid
来自我的源数据VarChar
的密钥"923D81A0-7B71-438d-8160-A524EA7EFA5E"
是,所以现在一个密钥不一样"923d81a0-7b71-438d-8160-a524ea7efa5e"
(使用Guids时不是问题).
关于.NET框架的真正好处(和甜蜜)是我能做到的:
Dictionary<string, CustomClass> _recordSet = new Dictionary<string, CustomClass>(
StringComparer.InvariantCultureIgnoreCase);
Run Code Online (Sandbox Code Playgroud)
这很有效.但是嵌套字典怎么样?如下:
Dictionary<int, Dictionary<string, CustomClass>> _customRecordSet
= new Dictionary<int, Dictionary<string, CustomClass>>();
Run Code Online (Sandbox Code Playgroud)
我如何在这样的嵌套字典中指定字符串比较器?
在验证数据时,我养成了做以下事情的习惯
*注意:我每次检查都没有真正的布尔值.这只是一个例子.
*另一个注意事项:测试期间的任何错误处理都已正确完成.try-catch中抛出的唯一异常是我自己的.
try {
if (validCheckOne = false) {
throw new Exception("Check one is bad");
}
if (validCheckTwo = false) {
throw new Exception("Failed because of check2");
}
if(validCheckTen = false) {
throw new Exception("Yet another failure on your part: check10.");
}
} catch(Exception e) {
MessageBox.Show("Your stupid data is wrong! See for yourself: " + e.Message);
}
Run Code Online (Sandbox Code Playgroud)
这是不好的做法吗?抛出异常会减慢程序的执行速度还是不可取的?
在我们的应用程序中存在某些情况,其中发生非致命错误并且应用程序恢复.
在将所述项目填充到选择列表时,无法正确识别某些可导入项目的示例.错误不会使应用程序崩溃,但会提醒用户某些项目无法加载.
在这种情况下,错误将作为警告记录到应用程序事件日志中.这是应用程序恢复的非致命错误,但是如果需要,登录到事件日志可以让我们看到原始错误.
我们的问题是该软件需要能够与高级用户帐户一起安装.不是管理员帐户,我们将无法为应用程序创建自定义事件源.
目的是将错误写入"应用程序"事件源(已存在于应用程序事件日志中).但是,这样做也会导致类似于以下内容的文本.
无法找到源应用程序中的事件ID 0的描述.引发此事件的组件未安装在本地计算机上,或者安装已损坏.您可以在本地计算机上安装或修复该组件.
这是因为当我们编写它时,EventID为0.这种方法可以完成工作,但有更好的方法吗?是否有非管理员方式为应用程序事件源指定EventID以指示它来自我们的应用程序?
在永无止境的性能搜索中(以及我自己的敲诈经验),我学到了一些可能会降低SQL语句性能的东西.
强迫性的子查询紊乱进行
疯狂的类型转换(并将这些转换为遗忘)
Group By上述疯狂类型转换的聚合函数
其中fldID in(从我的5mil记录表中选择一切)
我通常使用MSSQL.有哪些工具可用于测试SQL语句的性能?这些工具是否内置并且特定于每种类型的DB服务器?或者是否有通用工具?
我自动生成代码,根据配置(textboxes,dateTimePickers等)创建一个winform对话框.这些对话框上的控件是从保存的数据集中填充的
需要为各种控件对象(自定义或其他)设置和获取属性.
//Upon opening of form - populate control properties with saved values
MyObject.Value = DataSource.GetValue("Value");
//Upon closing of form, save values of control properties to dataset.
DataSource.SetValue("Value") = MyObject.Value;
Run Code Online (Sandbox Code Playgroud)
现在这一切都很好,但readOnly属性是什么?我希望保存属性的结果,但需要知道何时不生成将尝试填充它的代码.
//Open form, attempt to populate control properties.
//Code that will result in 'cannot be assigned to -- it is read only'
MyObject.HasValue = DataSource.GetValue("HasValue");
MyObject.DerivedValue = DataSource.GetValue("Total_SC2_1v1_Wins");
//Closing of form, save values.
DataSource.SetValue("HasValue") = MyObject.HasValue;
Run Code Online (Sandbox Code Playgroud)
请记住,直到运行时我才知道我实例化的对象类型.
我如何(在运行时)识别只读属性?
我已经负责一个有10年历史的事务系统,其中大多数业务逻辑是在数据库级别实现的(触发器,存储过程等).Win2000服务器,MSSQL 2000企业版.目前没有考虑更换或更新系统的直接计划.
核心进程是一个执行事务的程序 - 具体来说,它执行具有各种参数的存储过程; 我们称之为sp_ProcessTrans
.程序以异步间隔执行存储过程.
事情本身很好,但是在远程工作站上有30个这个程序的实例,所有这些实例都异步执行sp_ProcessTrans
,然后从SQL服务器检索数据.执行非常规则 - 每分钟0到60次,具体取决于程序实例负责的项目.
随着10年的数据增长,系统性能大幅下降:原因是Employee
桌面上的死锁,特别是死锁等待时间.
我发现:
sp_ProcessTrans
执行中,它从Employee
表中选择7次因此死锁的原因很明显.我创建了该领域的非唯一有序聚集索引(几乎是唯一的,NUM(7)
,很少改变).测试环境立即得到改善.问题是我无法模拟测试环境中的死锁.我需要30个工作站,我需要在这些工作站上模拟"现实"活动,因此可视化已经完成.
我需要知道是否必须安排停机时间.创建索引不应该是MSSQL的危险操作,但是在事务仍在进行时,在生产数据库上创建此字段索引是否存在任何危险(数据损坏,额外等待时间等)?我可以通过30个站选择交易相当安静的时间.
我没有看到任何隐藏的危险吗?(如果出现问题,我不期待恢复数据库.使用10年的数据需要花费很多时间.)
使用高级安装程序,我创建了一个生成 EXE 的包(有些部署功能无法包含在普通 MSI 文件中)。
现在,虽然高级安装程序允许我将命令行参数传递给底层 MSI,但我不知道要传递哪些参数来强制卸载软件包。
例如,以下参数记录设置事件并指示底层 MSI 被动运行并记录其自己的操作。
"c:\MySetup.exe" /exelog "c:\log.txt" /passive /log "c:\msilog.txt"
Run Code Online (Sandbox Code Playgroud)
AdvancedInstaller 执行的最终命令是
msiexec.exe /i [path to extracted msi] /passive /log "c:\msilog.txt"
Run Code Online (Sandbox Code Playgroud)
但尽我所能,我无法弄清楚如何让 AdvancedInstaller 使用 /uninstall 或 /x 开关启动 msiexec。例如:
"c:\MySetup.exe" /exelog "c:\log.txt" /x /log "c:\msilog.txt"
Run Code Online (Sandbox Code Playgroud)
结果是
msiexec.exe /i [path to extracted msi] /x /passive /log "c:\msilog.txt"
Run Code Online (Sandbox Code Playgroud)
这当然会失败,因为 /x 位于错误的位置(应该代替 /i)。高级安装程序 exe 需要哪些开关/参数?
我需要将对象的序列化XML表示形式作为字符串.我正在使用XmlSerializer和memoryStream来执行此操作.
XmlSerializer serializer = new XmlSerializer(typeof(MyClass));
using (MemoryStream stream = new MemoryStream())
{
using (XmlTextWriter writer = new XmlTextWriter(stream,Encoding.UTF8))
{
serializer.Serialize(writer, myClass);
string xml = Encoding.UTF8.GetString(stream.ToArray());
//other chars may be added from the encoding.
xml = xml.Substring(xml.IndexOf(Convert.ToChar(60)));
xml = xml.Substring(0, (xml.LastIndexOf(Convert.ToChar(62)) + 1));
return xml;
}
}
Run Code Online (Sandbox Code Playgroud)
现在只需记下xml.substring行.我发现的是(甚至认为我在XmlTextWriter和GetString上指定编码(我正在使用memoryStream.ToArray(),所以我只对流的缓冲区中的数据进行操作).产生的xml字符串添加了一些非xml快乐字符.在我的例子中,字符串开头是'?'.这就是为什么我要为'<'和'>'子字符串来确保我''只有得到好东西.
奇怪的是,在调试器中看到这个字符串(Text Visualizer),我没有看到这个'?'.只有当我将可视化器中的内容粘贴到记事本或类似内容中时.
因此,虽然上面的代码(substring etc)可以完成这项工作,但实际上这里发生了什么?是否包含一些无符号字节的东西,而不是在Text Visualizer中表示?
是的,我通常使用'using'指令如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace AwesomeLib
{
//awesome award winning class declarations making use of Linq
}
Run Code Online (Sandbox Code Playgroud)
我最近见过这样的例子
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace AwesomeLib
{
//awesome award winning class declarations making use of Linq
namespace DataLibrary
{
using System.Data;
//Data access layers and whatnot
}
}
Run Code Online (Sandbox Code Playgroud)
当然,我明白我可以将USING放在我的命名空间声明中.如果您的命名空间位于同一个根目录(它们有条理),这样的事情对我来说是有意义的.
System;
namespace 1 {}
namespace 2
{
System.data;
}
Run Code Online (Sandbox Code Playgroud)
但嵌套命名空间呢?就个人而言,我会将所有USING声明留在顶部,您可以轻松找到它们.相反,它看起来像是遍布源文件.
在嵌套命名空间中以这种方式使用的USING指令是否有益处?比如内存管理还是JIT编译器?
程序中的内存分配:代码和数据.堆.堆.
如果我有一个静态/全局变量(比如一个原始类型),那么理论建议在加载编译程序时分配内存(忽略此示例中的动态链接和加载,并假设程序包含一个模块).
但是如果全局变量是引用类型呢?运行时是否调整代码/数据区的内存分配?或者引用仅存在于代码/数据区域中并指向堆中的内存区域?
c# ×5
.net ×1
command-line ×1
dictionary ×1
encoding ×1
event-log ×1
exception ×1
indexing ×1
namespaces ×1
performance ×1
properties ×1
sql ×1
sql-server ×1
validation ×1