小编Kei*_*thS的帖子

使用Regex格式化电话号码

可能重复:
用于电话号码验证的全面正则表达式

我有一个未格式化的电话号码(保证是10位数)和未格式化的扩展名(可以是空,空白或任意数量的数字).我需要将它们组合成一个"友好"的字符串.我以为我会连接它们,然后使用Regex.Replace格式化连接.这是我插入之前用来尝试各种正则表达式的单元测试:

    [Test, Ignore("Sandbox, does not test production code")]
    public void TestPhoneRegex()
    {
        string number = "1234567890";
        string extension = "";

        var formattedContactNumber =
            Regex.Replace("{0} x{1}".FormatWith(number, extension),
                          @"^(\d{3})[ -]?(\d{3})[ -]?(\d{4})( x\d+)?",
                          @"$1-$2-$3$4");

        Debug.WriteLine("{0} x{1}".FormatWith(number, extension));
        Debug.WriteLine(formattedContactNumber);

        Assert.AreEqual("123-456-7890", formattedContactNumber);
    }
Run Code Online (Sandbox Code Playgroud)

预期的格式化字符串是格式化的电话号码,没有"x"和扩展名.但是,最后一个捕获组匹配"x"后面有或没有数字,所以代替"123-456-7890"我得到"123-456-7890 x".这是在发布之前需要关联的最后一点开发.救命?

c# regex

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

哪个更快 - 不是或不存在?

我有一个insert-select语句,只需插入其中两个表中不存在该行的特定标识符的行.以下哪项会更快?

INSERT INTO Table1 (...)
SELECT (...) FROM Table2 t2
WHERE ...
   AND NOT EXISTS (SELECT 'Y' from Table3 t3 where t2.SomeFK = t3.RefToSameFK)
   AND NOT EXISTS (SELECT 'Y' from Table4 t4 where t2.SomeFK = t4.RefToSameFK AND ...)
Run Code Online (Sandbox Code Playgroud)

... 要么...

INSERT INTO Table1 (...)
SELECT (...) FROM Table2 t2
WHERE ...
   AND t2.SomeFK NOT IN (SELECT RefToSameFK from Table3)
   AND t2.SomeFK NOT IN (SELECT RefToSameFK from Table4 WHERE ...)
Run Code Online (Sandbox Code Playgroud)

......或者他们的表现差不多?另外,有没有其他方法来构建这个查询更好?我通常不喜欢子查询,因为它们为查询添加了另一个"维度",它通过多项式因子增加运行时间.

sql t-sql performance

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

这种使用泛型的模式有名称吗?

//this class (or interface if you like) is set up as generic...
public abstract class GenericBase<T> 
{
    public T PerformBasicTask(T in) { ... }
}

//... but is intended to be inherited by objects that close the generic...
public class ConcreteForDates:GenericBase<DateTime>
{
    public DateTime PerformSpecificTask(DateTime in) { ... }
}

//... so that consuming code never knows that a generic is involved
var myDateConcrete = new ConcreteForDates(); //look ma, no GTP!
//These two methods look alike, and there is no …
Run Code Online (Sandbox Code Playgroud)

c# generics design-patterns

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

内置.NET集合分拣机的性能

有一个问题询问如何对List进行排序.从基本的List.Sort()到List.OrderBy()给出了几种方法.最可笑的是一个自己动手的Se​​lectionSort.我立刻投了票,但它让我思考; 不会的LINQ的排序依据(),适用于清单,做同样的事情?myList.OrderBy(X => x.Property).ToList()将产生基本上发现在什么剩下集合的投影的最小值和产量返回它的迭代器.在浏览整个列表时,这是一种选择排序.

这让我想到了; Lists,SortedLists,Enumerables等内置分类器使用什么算法,并且通过扩展,它们是否应该避免大型集合中的任何一个?SortedList,因为它按键排序,可能会在每次添加时使用单次传递InsertionSort; 找到第一个索引,其值大于新索引,并在其之前插入.列表和数组可能MergeSort本身非常有效,但我不知道Sort()背后的实际算法.我们已经讨论过OrderBy.

我上面所知的似乎表明List.Sort()或Array.Sort()是已知大小列表的最佳选项,并且不鼓励使用Linq对内存列表或数组进行排序.对于一个流,那么OrderBy()确实没有任何其他方法可枚举; 由于您可以将数据保存为流而不必在排序之前完成所有操作,因此可以减轻性能损失.

编辑:

普遍的共识是,给定List或Array的具体实现,Sort()更快.OrderBy是合理的但速度较慢,因为它增加了从传递的可枚举中提取数组的O(N)复杂性.SortedList初始化最终为O(N ^ 2),因为它的内幕是什么.故事的道德,当你有一个实际的List时,使用List.Sort()而不是List.OrderBy().

.net sorting collections performance

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

建立一个安全库,我想我正在过度建设它

所以我正在构建一个自定义安全库,它与我们的数据库连接.它应该为内部应用程序提供基本的访问控制:某些用户可以执行X,而其他用户则无法执行.我目前的需求非常基本,但是这个库最终会被多个应用程序使用并控制很多安全性.

我的基本对象模型是User是零个或多个Groups的成员.这些组授予零个或多个权限.实际上,这些都是一对多的,但我不想参考这一点.权限仅限授权(如果没有组授予您权限,您没有权限,但没有"拒绝"覆盖授予的权限,例如在Windows RBS中),并且组可以嵌套(第2层用户)拥有第1层的权利,加上一些新的权利.当试图访问程序的安全区域时,应用程序将通过检查其组层次结构强制断言用户具有必要的权限.

但是,我希望库中内置多个级别的冗余.特别重要的是,无权更改安全设置的用户不应该这样做.因此,我想在大多数情况下使这个安全层次结构只读,因此无法在内存中添加必需但拒绝的权限.只有当用户已经证明他们有权通过向只读用户提供该权限来修改安全设置时,属性是否可以从代码级别进行设置.

这就是我认为我已经过度建造它的地方.为了做到这一点,该领域已经形成了分裂的个性; 每个对象的两个副本,一个只读,另一个不.readonly版本是默认生成的版本; 任何产生可写版本的操作都要求当前登录的用户具有进行安全性更改的权限.这导致两个用户(用户和可配置用户),两个组,两个权限,每个有两个接口(可配置派生自readonly)...你明白了.

我已经意识到,基本上所有这些额外的人都会停下来的是其他开发人员,他们通常都值得信赖(这是一个内部应用程序,我们控制着这个应用程序使用的所有资源,开发人员通常获得管理员权限很多).如果我可以相信触摸代码的人知道他们正在做什么,那么应用程序可以是可读写的,并且通过聪明的代码片段可以"提升"权限的可能性也不会有问题.

帮助我理智.我应该遵循不同的模式吗?我不相信其他开发者吗?我不想与Windows安全性集成,但已讨论过该选项; 主要缺点是访问权限将在整个公司的Active Directory中维护,并且此应用程序的用户管理员不应具有对整个系统安全性的那种访问权限.

编辑:一些好的评论和答案.AD或其他集成安全性并非完全脱离桌面,但我们在开始开发之前就讨论过它,并发现了一些缺点.所以,这里有一些我/我们的想法,为什么我们决定采用"自定义"安全设置:

  • 该应用程序的使用完全在内部.因此,这个应用程序的安全性并不是防止外部攻击/恶意收购,而是让乔办公室工作人员不要根据业务政策做一些他不应该做的事情.如果Joe最终奇迹般地找到了在应用程序中使自己成为"上帝"的方法,他的能力仍然非常有限,因为应用程序本身对数据库和其他资源的访问非常有限,其中大部分都是他需要做的无论如何,工作因为甚至是最低级别的用户而被授予.

  • 尽管如此,如果用户的Windows密码遭到网络钓鱼,破解或键盘攻击,如果应用程序使用集成安全性而不是传统登录,攻击者可以通过应用程序"免费"获得对客户端数据的一些认真访问权限.应用程序的单独安全层至少提供冗余的可能性; 他们必须破解两套凭证而不是一套,而第二套凭证被锁定在破解用户无法自由访问的另一层数据库安全性之后.

  • 从开发/管理角度来看,使用Active Directory或其他集成安全性存在一些问题.

    1. 首先,该部门的成员"交换办公桌",并在彼此的计算机上做相当多的事情.与Windows安全性集成需要用户一直记录操作系统以更改应用程序当前登录的用户,而不是仅以其他用户关闭,重新打开和登录应用程序.
    2. 其次,将使用该软件的部门经理是在应用程序中处理安全权限的合理人选,但不是向其提供AD管理员访问权限的合理人选.平衡需要AD中的额外一层角色来提供可以访问AD的"子管理员",但仅授予某些人某些权限.还有文件要求将安全管理集成到应用程序中,IMO使AD集成不可行.
    3. 最后,据我所知,Windows Integrated Security没有"权限"层.您声明用户处于特定角色,而不是断言用户具有执行某项操作的声明权限,而该推断是该角色有权继续.因此,我可以开发一个系统,要求AD为应用程序中的每个特定安全设备发挥作用,嵌入到用户将拥有的逻辑角色中(行政噩梦,我确信网络管理员会为防止他的安全而战斗(或)我们定义了属于已知角色的大量功能,嵌套角色以创建"用户级别",如果用户需要访问下一级别的一个功能,他们必须得到整个级别(或AD和我的应用程序必须更改以将该功能分成特定的可分配角色).

考虑到所有这些,简单的解决方案是在应用程序的范围内包含安全性,而不是绑定到网络安全性.我们得到了一个安全结构,我们可以相对轻松地维护,在应用程序停止.

编辑2:作为这个问题的结尾,我最终得出的解决方案是保留我的可变对象层次结构,然后创建一个简单的接口,IAuthUser,用户的基本信息和权限的只读成员.IAuthUsers仅在一个位置创建 - 在登录期间 - 通过将使用凭据检索的用户复制到实现公共接口的私有类中.它们用于所有身份验证和授权,方法是在启动时查询从用户的组成员身份投影的所包含权限列表.它们永远不会变回可变用户,因此永远不会保存回数据库.同时,可变用户不能在登录过程之外转换为IAuthUsers,因此对授权无用,并且如果没有提供有权在对象中检测到更改类型的IAuthUser,则无法将它们保存回数据库(通过将其与DB中当前的版本进行比较)

.net c# architecture security

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

SQL Server 中的负数据库 ID

SQL Server 中的数据库 ID 可以为负数吗?

我知道您总共可以拥有 32767 个(对于 32 位和 64 位)(最大容量 SQL Server)

我知道前几个数据库 ID 是为 master、model、msdb 和 tempdb 保留的,而 32767 是隐藏的系统资源数据库。

我从未见过负面的数据库 ID,但我想确认这是不可能的。

sql-server

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

调整窗口大小时,锚定控件不会调整大小(56k注意)

这个真的踢我的背后.我有一个表单,由应用程序的主要形式生成并拥有,用于搜索记录.表单放在一个停靠的TableLayoutPanel中,结合了Absolute和Percentage大小的行/列,这样我的标签在数据输入和结果控件增长时保持相同的大小.我们谈论的是20个控件.

问题是,虽然TableLayoutPanel是填充停靠的,并且所有子控件也都是填充停靠的,但是当我抓住窗口边缘并拖动时,表单内的任何内容都没有调整大小.一切都在设计师中调整得很好,但在实际应用中却没有.

我确实使用了我的Google-fu,并发现了这个问题,这个问题指向了这篇MSKB文章.我创建了一个派生的FlowLayoutPanel和一个带有线程调用的派生TableLayoutPanel并将它们放入,但它仍然无法正常工作.这是发生这种情况的唯一形式,另一种形式也有一些非常深的嵌套(它使用TabControl和TableLayoutPanel来布局数据输入控件,但没有RB).

其他相关信息:

  • 没有设置MaxSize属性.
  • 除了默认的左上角之外,这种形式没有任何内容; 几乎所有东西都填充到它的容器中.但是,包含搜索结果表的子用户控件使用锚定在内部布局; 这在我使用这些控件的其他形式中并不是问题,我将它们填充到SplitPanels(嵌套两个深,不少).
  • RadioButtons和Labels设置为AutoSize,但没有别的.这似乎是这些控件的默认行为,即使这些值在Designer中以粗体显示,并且与正确调整大小的其他窗口的设置相匹配.
  • 将为表单触发调整大小事件,但不会触发TLP.
  • 当TLP锚定到正在停靠的窗口INSTEAD时,行为不会改变(它不会同时出现).

我在这里撕扯我的头发.救命!

编辑:以下是一些显示设计器和应用程序中的布局行为的请求图片:

替代文字 替代文字 替代文字 替代文字

以"嵌套"开头的控件直接来自内置面板控件,它们唯一的更改是重写OnSizeChanged()以异步调用基本方法(KB文章中的解决方法).正如我之前所说,它也不适用于内置面板.从最后两个窗口可以看出,mainLayout TLP即使停靠在设计器的窗口中也不会增长.

c# datagridview mouseevent winforms

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

Linq到Salesforce"SQL"提供商

所以,我有这个新项目.我公司使用SalesForce.com云存储有关日常运营的信息.我的工作是编写一个新的应用程序,除其他外,它将这个数据的CRUD操作与现有的内部应用程序功能更加无缝地集成.

Salesforce WSDL API的核心是一组"query()"Web方法,它们将查询命令作为字符串.查询的语法是SQL-ish,但不完全(他们称之为SOQL).我不是"魔术字符串"的粉丝,所以我想在代码库中使用Linq,并将IQueryable解析为我在服务包装器中需要的SOQL查询.这当然是可能的(L2E,L2Sql),但我想知道是否有快捷方式,因为如果我说它需要花费一两天才能推出我自己的,我会被"鼓励"找到另一种方法(很可能是每个通用查询的方法,这是旧应用程序中使用的方法).如果我成功创建了一个通用的SOQL解析器,我们可以在其他几个即将推出的应用程序中使用它,我将成为英雄.

以下是我看到的选项:

  • 现在的Linq2SOQL提供商看起来更难了(我的Google-fu在这里让我失望,否则根本就没有;唯一的.NET包装器只提到Linq是一个很好的产品).
  • 构建表达式树解析器.它至少需要支持Select和Where方法调用,并且需要解析lambda或操纵它们的方法体以获得所需的操作和投影.这似乎是一项相当庞大的任务,但就像我说的那样,这当然是可能的.
  • 在Linq2Sql或类似的现有Linq提供程序中包装服务,这将允许我提取足够接近的查询字符串,对其进行修改并将其传递给服务.那里肯定有几十个(虽然没有一个只是插入,AFAIK).
  • 调用Expression.ToString()(或Expression.DebugView),并操纵该字符串以创建SOQL查询.它会变得脆弱,它会变得丑陋(在幕后),它只会支持我明确寻找的东西,但它会提供一个基本的翻译,让我继续前进.

你们有什么感想?为一个人构建一个Linq解析器超过两天的任务?涉及现有Linq提供商的提升解决方案可能会这样做吗?切断表达式字符串并以这种方式构造我的查询会不会很糟糕?

编辑:感谢Kirk的接地.我更多地了解了即使是基本的SOQL解析器我还需要做些什么,而且我的工作应用程序代码在任何可行的时间表上编写都超出了我的范围.例如,我必须从我的WSDL对象的所有已知列中的Select()方法lambda或默认的一个构建一个选择列表,这个任务我甚至都没想过(我更关注Where解析) .我敢肯定还有很多其他"未知的未知数"可能会把这变成一个非常重要的事情.我找到了几个链接,它们显示了编写Linq提供程序的基础知识,尽管它们都试图使它变得简单,但现在只是时间不可行.我现在将构建我的存储库,使用封装命名查询的命名方法(格式化查询字符串的常量类应该减少维护中的头部刮擦量).不完美,但更可行.如果Linq2SOQL提供商在内部或开源时启动,我们可以重构.

对于寻找Linq提供者参考的其他人,以下是我发现的有用链接:

c# linq salesforce expression-trees soql

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

无法让RhinoMocks发出遵循泛型类型限制规则的模拟

所以,使用NUnit和RhinoMocks:

//Defines basic behavior of all persistable domain objects
public interface IDomainObject {...}

//defines domain objects specific to the Security DB
public interface ISecurityDomainObject : IDomainObject {...}

//Defines a basic transactional data Repository; there are multiple implementors
//which each close TRest to the interface that defines their DB's domain classes
public interface IRepository<TRest> : IDisposable where TRest:IDomainObject
{
    IUnitOfWork BeginUnitOfWork();
    void CommitUnitOfWork(IUnitOfWork unitOfWork);
    void RollBackUnitOfWork(IUnitOfWork unitOfWork);        
    void Save<T>(T domainObject, IUnitOfWork unitOfWork) where T : class, TRest;        
    IQueryable<T> QueryFor<T>(IUnitOfWork unitOfWork) where …
Run Code Online (Sandbox Code Playgroud)

c# rhino-mocks

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

反射测试未显示预期数字

我已经编写了一些测试代码,用于比较使用直接属性访问或使用委托的反射或反射的性能.但是我得到的结果令人费解,因为它表明反射并不比直接属性访问慢得多(约4%),我认为这不是真的.有人能告诉我,我在这里做错了吗?


对于5000件物品,我得到以下结果

  • 直接访问:32.2609秒
  • 反射:33.623秒反射
  • 使用代表:31.7981秒

码:

private static Random random = new Random((int)DateTime.Now.Ticks);
Private Dictionary<string, Delegate> delegateList = new Dictionary<string, Delegate>(); 
private List<ReflectClass1> dataList = new List<ReflectClass1>();

    private void TestMethod2<T>()
    {
        foreach (var propertyInfo in typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance))
        {
            if (propertyInfo.PropertyType.BaseType != typeof(ValueType))
            {
                Func<T, object> getPropDelegate =
                    (Func<T, object>) Delegate.CreateDelegate(typeof (Func<T, object>), null, propertyInfo.GetGetMethod());
                delegateList.Add(propertyInfo.Name, getPropDelegate);
            }
            //else
            //{
            //    Type propertyType = propertyInfo.PropertyType.GetType();
            //    delegateList.Add(propertyInfo.Name,
            //                     Delegate.CreateDelegate(typeof(Func<T, TResult>), null, propertyInfo.GetGetMethod()));
            //}
        }
    }
    //http:_//stackoverflow.com/questions/1122483/c-random-string-generator     
    private string RandomString(int size) …
Run Code Online (Sandbox Code Playgroud)

c# reflection performance delegates c#-4.0

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