小编MoS*_*Slo的帖子

c#Dictionary:通过声明使Key不区分大小写

我有一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)

我如何在这样的嵌套字典中指定字符串比较器?

c# dictionary case-insensitive

70
推荐指数
2
解决办法
3万
查看次数

在验证数据时抛出异常是好还是坏?

在验证数据时,我养成了做以下事情的习惯

*注意:我每次检查都没有真正的布尔值.这只是一个例子.

*另一个注意事项:测试期间的任何错误处理都已正确完成.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)

这是不好的做法吗?抛出异常会减慢程序的执行速度还是不可取的?

validation exception

62
推荐指数
6
解决办法
2万
查看次数

写入应用程序事件源是否可以接受?

在我们的应用程序中存在某些情况,其中发生非致命错误并且应用程序恢复.

在将所述项目填充到选择列表时,无法正确识别某些可导入项目的示例.错误不会使应用程序崩溃,但会提醒用户某些项目无法加载.

在这种情况下,错误将作为警告记录到应用程序事件日志中.这是应用程序恢复的非致命错误,但是如果需要,登录到事件日志可以让我们看到原始错误.

我们的问题是该软件需要能够与高级用户帐户一起安装.不是管理员帐户,我们将无法为应用程序创建自定义事件源.

目的是将错误写入"应用程序"事件源(已存在于应用程序事件日志中).但是,这样做也会导致类似于以下内容的文本.

无法找到源应用程序中的事件ID 0的描述.引发此事件的组件未安装在本地计算机上,或者安装已损坏.您可以在本地计算机上安装或修复该组件.

这是因为当我们编写它时,EventID为0.这种方法可以完成工作,但有更好的方法吗?是否有非管理员方式为应用程序事件源指定EventID以指示它来自我们的应用程序?

c# event-log

8
推荐指数
1
解决办法
2609
查看次数

有哪些工具可用于测试SQL语句的性能?

在永无止境的性能搜索中(以及我自己的敲诈经验),我学到了一些可能会降低SQL语句性能的东西.

强迫性的子查询紊乱进行
疯狂的类型转换(并将这些转换为遗忘)
Group By上述疯狂类型转换的聚合函数
其中fldID in(从我的5mil记录表中选择一切)

我通常使用MSSQL.有哪些工具可用于测试SQL语句的性能?这些工具是否内置并且特定于每种类型的DB服务器?或者是否有通用工具?

sql sql-server performance performance-testing

7
推荐指数
1
解决办法
2万
查看次数

在运行时,如何测试属性是否只读?

我自动生成代码,根据配置(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)

请记住,直到运行时我才知道我实例化的对象类型.

我如何(在运行时)识别只读属性?

c# properties

7
推荐指数
2
解决办法
4318
查看次数

将聚簇索引添加到SQL表:实时生产系统存在哪些危险?

我已经负责一个有10年历史的事务系统,其中大多数业务逻辑是在数据库级别实现的(触发器,存储过程等).Win2000服务器,MSSQL 2000企业版.目前没有考虑更换或更新系统的直接计划.

核心进程是一个执行事务的程序 - 具体来说,它执行具有各种参数的存储过程; 我们称之为sp_ProcessTrans.程序以异步间隔执行存储过程.

事情本身很好,但是在远程工作站上有30个这个程序的实例,所有这些实例都异步执行sp_ProcessTrans,然后从SQL服务器检索数据.执行非常规则 - 每分钟0到60次,具体取决于程序实例负责的项目.

随着10年的数据增长,系统性能大幅下降:原因是Employee桌面上的死锁,特别是死锁等待时间.

我发现:

  • sp_ProcessTrans执行中,它从Employee表中选择7次
  • 选择是在不是主键的字段上完成的
  • 此字段不存在索引.因此,每次事务执行7次表扫描

因此死锁的原因很明显.我创建了该领域的非唯一有序聚集索引(几乎是唯一的,NUM(7),很少改变).测试环境立即得到改善.问题是我无法模拟测试环境中的死锁.我需要30个工作站,我需要在这些工作站上模拟"现实"活动,因此可视化已经完成.

我需要知道是否必须安排停机时间.创建索引不应该是MSSQL的危险操作,但是在事务仍在进行时,在生产数据库上创建此字段索引是否存在任何危险(数据损坏,额外等待时间等)?我可以通过30个站选择交易相当安静的时间.

我没有看到任何隐藏的危险吗?(如果出现问题,我不期待恢复数据库.使用10年的数据需要花费很多时间.)

indexing sql-server-2000

6
推荐指数
1
解决办法
3372
查看次数

高级安装程序Setup.exe - 命令行开关卸载包

使用高级安装程序,我创建了一个生成 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 需要哪些开关/参数?

command-line advanced-installer

5
推荐指数
1
解决办法
5483
查看次数

将对象序列化为字符串:为什么我的编码添加了愚蠢的字符?

我需要将对象的序列化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中表示?

c# encoding xml-serialization

4
推荐指数
2
解决办法
4390
查看次数

C#在嵌套命名空间中使用namespace指令

是的,我通常使用'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# namespaces using-directives

3
推荐指数
1
解决办法
6927
查看次数

如何在.NET中将内存分配给全局变量?

程序中的内存分配:代码和数据.堆.堆.

如果我有一个静态/全局变量(比如一个原始类型),那么理论建议在加载编译程序时分配内存(忽略此示例中的动态链接和加载,并假设程序包含一个模块).

但是如果全局变量是引用类型呢?运行时是否调整代码/数据区的内存分配?或者引用仅存在于代码/数据区域中并指向堆中的内存区域?

.net memory-management

1
推荐指数
1
解决办法
1154
查看次数