小编sgm*_*ore的帖子

SQL统计和索引 - 它们有多详细?

统计信息(有助于决定是否使用索引)会考虑每个实际列值的行数,还是仅使用每个值的平均行数.

假设我有一个名为active的位列的表,它有一百万行,但99.99%设置为false.如果我在这个列上有一个索引,那么Sql足够聪明,如果搜索active = 1就知道使用索引但是如果搜索active = 0则没有意义.

另一个例子,如果我有一个表有1,000,000条记录,其索引列包含大约50,000个不同的值,每个值的平均行数为10,但是一个特殊值有500,000行.如果搜索此特殊记录,索引可能没用,但在查找任何其他代码时非常有用.

但这种特殊情况是否会破坏指数的有效性.

sql-server statistics performance

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

派生类上没有扩展方法'First'

鉴于(非常简单)代码.

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# generics extension-methods

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

clr.Dll!MetaDataGetDispenser和高于预期的CPU使用率

我有一个用C#编写的Windows服务,它运行在客户的服务器上,似乎工作正常,没有任何问题,但这个过程的CPU使用率通常远高于我的预期.它永远不会超过50%,但仍然远高于我在室内跑步时看到的单个数字.

这可能只是由于更高的工作负载,但我试图确定服务究竟在做什么,并且进程资源管理器报告了许多线程,其起始地址为clr.Dll!MetaDataGetDispenser,每个线程的CPU使用率都很低,但是所有加起来.

有谁知道这个和什么类型的代码将使用它?

该服务将使用WCF连接到各种客户端(并且可能涉及某种类型的序列化),并且还将访问Microsoft SQL Server,但没有明确的反映.

c# wcf diagnostics

5
推荐指数
0
解决办法
527
查看次数

锁是否需要这个.Invoke

我遇到了第三方代码,它使用invoke来更新控件,但是调用是在一个锁定语句中,例如

 lock (mi) 
 {
   this.Invoke(mi);
 }
Run Code Online (Sandbox Code Playgroud)

其中mi是System.Windows.Forms.MethodInvoker mi.

调用的方法只是更新一个窗口控件(列表框),并在创建用户控件时进行初始化,并且永远不会更改.

所以有两个问题

  1. 是否需要锁?
  2. 它可能会导致问题吗?

c# invoke winforms

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

使用DateTimePicker CustomFormat MMM-yyyy时避免不可表示的DateTime

假设我有一个带有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,然后尝试使用键盘更改月份.

datetimepicker winforms

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

重写 XMLDocument 以使用命名空间前缀

我有一个 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# xml xml-namespaces

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

将参数从ArrayList迁移到List <T>

我有一个大型项目,最初是用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# generics .net-2.0

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