统计信息(有助于决定是否使用索引)会考虑每个实际列值的行数,还是仅使用每个值的平均行数.
假设我有一个名为active的位列的表,它有一百万行,但99.99%设置为false.如果我在这个列上有一个索引,那么Sql足够聪明,如果搜索active = 1就知道使用索引但是如果搜索active = 0则没有意义.
另一个例子,如果我有一个表有1,000,000条记录,其索引列包含大约50,000个不同的值,每个值的平均行数为10,但是一个特殊值有500,000行.如果搜索此特殊记录,索引可能没用,但在查找任何其他代码时非常有用.
但这种特殊情况是否会破坏指数的有效性.
鉴于(非常简单)代码.
public class Class1
{
}
public class Class2 : Class1
{
}
public class List1 : System.Collections.Generic.IEnumerable<Class1>
{
public new System.Collections.Generic.IEnumerator<Class1> GetEnumerator()
{
yield return new Class1();
}
IEnumerator IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
}
public class List2 : List1 , System.Collections.Generic.IEnumerable<Class2>
{
public new System.Collections.Generic.IEnumerator<Class2> GetEnumerator()
{
yield return new Class2();
}
IEnumerator IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
}
Run Code Online (Sandbox Code Playgroud)
然后是代码
var l = new List2();
var first = l.First();
Run Code Online (Sandbox Code Playgroud)
不会编译,但会给出错误
'List2'不包含'First'的定义,也没有扩展方法'First'可以找到接受类型'List2'的第一个参数(你是否缺少using指令或汇编引用?)
如果List2不是从List1派生的,那么它编译好,这证明List2确实有一个有效的扩展方法.
这只是一个误导性错误的情况,问题是它有两个扩展方法,不知道选择哪一个?
如果是这样,为什么它不能像编译器使用方法重载解析那样告诉Class2更具体的版本?
我有一个用C#编写的Windows服务,它运行在客户的服务器上,似乎工作正常,没有任何问题,但这个过程的CPU使用率通常远高于我的预期.它永远不会超过50%,但仍然远高于我在室内跑步时看到的单个数字.
这可能只是由于更高的工作负载,但我试图确定服务究竟在做什么,并且进程资源管理器报告了许多线程,其起始地址为clr.Dll!MetaDataGetDispenser,每个线程的CPU使用率都很低,但是所有加起来.
有谁知道这个和什么类型的代码将使用它?
该服务将使用WCF连接到各种客户端(并且可能涉及某种类型的序列化),并且还将访问Microsoft SQL Server,但没有明确的反映.
我遇到了第三方代码,它使用invoke来更新控件,但是调用是在一个锁定语句中,例如
lock (mi)
{
this.Invoke(mi);
}
Run Code Online (Sandbox Code Playgroud)
其中mi是System.Windows.Forms.MethodInvoker mi.
调用的方法只是更新一个窗口控件(列表框),并在创建用户控件时进行初始化,并且永远不会更改.
所以有两个问题
假设我有一个带有MMM-yyyy CustomFormat的DateTimePicker,它已被初始化为2013年10月31日的值,这将显示为2013年10月.
如果选择控件的Oct部分并按向上或向下箭头,则会生成ArgumentOutOfRangeException - Year,Month和Day参数描述不可表示的DateTime.
据推测,它正在改变月份而不改变一天,9月和11月只有30天.请注意,如果CustomFormat为dd-MMM-yyyy,则不会引发任何错误,因为该日期会自动更改为30日.
如何避免或发现此错误?
我可以添加代码以确保DateTimePicker始终初始化为一个月的第一天,但我想允许用户从日历下拉列表中选择月份和日期,因此我需要应对用户手动操作的情况选择了31,然后尝试使用键盘更改月份.
我有一个 XMLDocument,当我保存到文件时,它会在大多数元素上重复命名空间,如下所示
<Test>
<Test xmlns="http://example.com/schema1">
<Name xmlns="http://example.com/schema2">xyz</Name>
<AddressInfo xmlns="http://example.com/schema2">
<Address>address</Address>
<ZipCode>zzzz</ZipCode>
</AddressInfo>
...
Run Code Online (Sandbox Code Playgroud)
是否可以修改此文件,以便它在整个文档中使用名称空间前缀,即类似的内容
<Test xmlns="http://example.com/schema1" xmlns:p="http://example.com/schema2" >
<p:Name>xyz</p:Name>
<p:AddressInfo">
<p:Address>address</p:Address>
<p:ZipCode>zzzz</p:ZipCode>
</p:AddressInfo>
...
Run Code Online (Sandbox Code Playgroud)
我尝试过添加
doc.DocumentElement.SetAttribute("xmlns:p", "http://example.com/schema2");
Run Code Online (Sandbox Code Playgroud)
但是,虽然这将命名空间添加到标头中,但文件的主体并未更改。
我有一个大型项目,最初是用C#1.1编写的,现在面向C#2.0.有几个类有一些方法,它们采用一个ArrayList参数我想开始将它们List<T>作为一个参数接受,但是这不能一次完成,所以我需要接受这两个参数.
迁移的主要原因是List<>对象将被接受为参数,但我也想利用类型安全性.
考虑过了
1)创建重载并复制代码.这样做的好处是允许我将旧样式代码标记为过时,但显然重复代码很糟糕.
2)将参数更改为IEnumerable:这具有使用旧代码和新代码的优点,但不是类型安全的,因为它将接受List<T1>它应该在哪里List<T2>
3)重写方法以获取List<T>参数并编写一个瘦包装器,该包装器接受ArrayList参数并将项目复制到new List<T>,然后调用main方法.这也有一个优点,就是允许我将旧样式代码标记为过时.它会有轻微的性能/ GC命中.
4)创建三个重载.一个私有方法,它采用IEnumerable和两个公共包装器方法(一个用于ArrayList,一个用于List<T>),它们只调用私有方法.这也有一个优点,就是允许我将旧样式代码标记为过时.除了有三种方法之外,不确定它是否有任何不利之处.
我倾向于4,但我忽略了什么?
c# ×5
generics ×2
winforms ×2
.net-2.0 ×1
diagnostics ×1
invoke ×1
performance ×1
sql-server ×1
statistics ×1
wcf ×1
xml ×1