可能重复:
用于电话号码验证的全面正则表达式
我有一个未格式化的电话号码(保证是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".这是在发布之前需要关联的最后一点开发.救命?
我有一个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)
......或者他们的表现差不多?另外,有没有其他方法来构建这个查询更好?我通常不喜欢子查询,因为它们为查询添加了另一个"维度",它通过多项式因子增加运行时间.
//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) 有一个问题询问如何对List进行排序.从基本的List.Sort()到List.OrderBy()给出了几种方法.最可笑的是一个自己动手的SelectionSort.我立刻投了票,但它让我思考; 不会的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().
所以我正在构建一个自定义安全库,它与我们的数据库连接.它应该为内部应用程序提供基本的访问控制:某些用户可以执行X,而其他用户则无法执行.我目前的需求非常基本,但是这个库最终会被多个应用程序使用并控制很多安全性.
我的基本对象模型是User是零个或多个Groups的成员.这些组授予零个或多个权限.实际上,这些都是一对多的,但我不想参考这一点.权限仅限授权(如果没有组授予您权限,您没有权限,但没有"拒绝"覆盖授予的权限,例如在Windows RBS中),并且组可以嵌套(第2层用户)拥有第1层的权利,加上一些新的权利.当试图访问程序的安全区域时,应用程序将通过检查其组层次结构强制断言用户具有必要的权限.
但是,我希望库中内置多个级别的冗余.特别重要的是,无权更改安全设置的用户不应该这样做.因此,我想在大多数情况下使这个安全层次结构只读,因此无法在内存中添加必需但拒绝的权限.只有当用户已经证明他们有权通过向只读用户提供该权限来修改安全设置时,属性是否可以从代码级别进行设置.
这就是我认为我已经过度建造它的地方.为了做到这一点,该领域已经形成了分裂的个性; 每个对象的两个副本,一个只读,另一个不.readonly版本是默认生成的版本; 任何产生可写版本的操作都要求当前登录的用户具有进行安全性更改的权限.这导致两个用户(用户和可配置用户),两个组,两个权限,每个有两个接口(可配置派生自readonly)...你明白了.
我已经意识到,基本上所有这些额外的人都会停下来的是其他开发人员,他们通常都值得信赖(这是一个内部应用程序,我们控制着这个应用程序使用的所有资源,开发人员通常获得管理员权限很多).如果我可以相信触摸代码的人知道他们正在做什么,那么应用程序可以是可读写的,并且通过聪明的代码片段可以"提升"权限的可能性也不会有问题.
帮助我理智.我应该遵循不同的模式吗?我不相信其他开发者吗?我不想与Windows安全性集成,但已讨论过该选项; 主要缺点是访问权限将在整个公司的Active Directory中维护,并且此应用程序的用户管理员不应具有对整个系统安全性的那种访问权限.
编辑:一些好的评论和答案.AD或其他集成安全性并非完全脱离桌面,但我们在开始开发之前就讨论过它,并发现了一些缺点.所以,这里有一些我/我们的想法,为什么我们决定采用"自定义"安全设置:
该应用程序的使用完全在内部.因此,这个应用程序的安全性并不是防止外部攻击/恶意收购,而是让乔办公室工作人员不要根据业务政策做一些他不应该做的事情.如果Joe最终奇迹般地找到了在应用程序中使自己成为"上帝"的方法,他的能力仍然非常有限,因为应用程序本身对数据库和其他资源的访问非常有限,其中大部分都是他需要做的无论如何,工作因为甚至是最低级别的用户而被授予.
尽管如此,如果用户的Windows密码遭到网络钓鱼,破解或键盘攻击,如果应用程序使用集成安全性而不是传统登录,攻击者可以通过应用程序"免费"获得对客户端数据的一些认真访问权限.应用程序的单独安全层至少提供冗余的可能性; 他们必须破解两套凭证而不是一套,而第二套凭证被锁定在破解用户无法自由访问的另一层数据库安全性之后.
从开发/管理角度来看,使用Active Directory或其他集成安全性存在一些问题.
考虑到所有这些,简单的解决方案是在应用程序的范围内包含安全性,而不是绑定到网络安全性.我们得到了一个安全结构,我们可以相对轻松地维护,在应用程序停止.
编辑2:作为这个问题的结尾,我最终得出的解决方案是保留我的可变对象层次结构,然后创建一个简单的接口,IAuthUser,用户的基本信息和权限的只读成员.IAuthUsers仅在一个位置创建 - 在登录期间 - 通过将使用凭据检索的用户复制到实现公共接口的私有类中.它们用于所有身份验证和授权,方法是在启动时查询从用户的组成员身份投影的所包含权限列表.它们永远不会变回可变用户,因此永远不会保存回数据库.同时,可变用户不能在登录过程之外转换为IAuthUsers,因此对授权无用,并且如果没有提供有权在对象中检测到更改类型的IAuthUser,则无法将它们保存回数据库(通过将其与DB中当前的版本进行比较)
SQL Server 中的数据库 ID 可以为负数吗?
我知道您总共可以拥有 32767 个(对于 32 位和 64 位)(最大容量 SQL Server)
我知道前几个数据库 ID 是为 master、model、msdb 和 tempdb 保留的,而 32767 是隐藏的系统资源数据库。
我从未见过负面的数据库 ID,但我想确认这是不可能的。
这个真的踢我的背后.我有一个表单,由应用程序的主要形式生成并拥有,用于搜索记录.表单放在一个停靠的TableLayoutPanel中,结合了Absolute和Percentage大小的行/列,这样我的标签在数据输入和结果控件增长时保持相同的大小.我们谈论的是20个控件.
问题是,虽然TableLayoutPanel是填充停靠的,并且所有子控件也都是填充停靠的,但是当我抓住窗口边缘并拖动时,表单内的任何内容都没有调整大小.一切都在设计师中调整得很好,但在实际应用中却没有.
我确实使用了我的Google-fu,并发现了这个问题,这个问题指向了这篇MSKB文章.我创建了一个派生的FlowLayoutPanel和一个带有线程调用的派生TableLayoutPanel并将它们放入,但它仍然无法正常工作.这是发生这种情况的唯一形式,另一种形式也有一些非常深的嵌套(它使用TabControl和TableLayoutPanel来布局数据输入控件,但没有RB).
其他相关信息:
我在这里撕扯我的头发.救命!
编辑:以下是一些显示设计器和应用程序中的布局行为的请求图片:

以"嵌套"开头的控件直接来自内置面板控件,它们唯一的更改是重写OnSizeChanged()以异步调用基本方法(KB文章中的解决方法).正如我之前所说,它也不适用于内置面板.从最后两个窗口可以看出,mainLayout TLP即使停靠在设计器的窗口中也不会增长.
所以,我有这个新项目.我公司使用SalesForce.com云存储有关日常运营的信息.我的工作是编写一个新的应用程序,除其他外,它将这个数据的CRUD操作与现有的内部应用程序功能更加无缝地集成.
Salesforce WSDL API的核心是一组"query()"Web方法,它们将查询命令作为字符串.查询的语法是SQL-ish,但不完全(他们称之为SOQL).我不是"魔术字符串"的粉丝,所以我想在代码库中使用Linq,并将IQueryable解析为我在服务包装器中需要的SOQL查询.这当然是可能的(L2E,L2Sql),但我想知道是否有快捷方式,因为如果我说它需要花费一两天才能推出我自己的,我会被"鼓励"找到另一种方法(很可能是每个通用查询的方法,这是旧应用程序中使用的方法).如果我成功创建了一个通用的SOQL解析器,我们可以在其他几个即将推出的应用程序中使用它,我将成为英雄.
以下是我看到的选项:
你们有什么感想?为一个人构建一个Linq解析器超过两天的任务?涉及现有Linq提供商的提升解决方案可能会这样做吗?切断表达式字符串并以这种方式构造我的查询会不会很糟糕?
编辑:感谢Kirk的接地.我更多地了解了即使是基本的SOQL解析器我还需要做些什么,而且我的工作应用程序代码在任何可行的时间表上编写都超出了我的范围.例如,我必须从我的WSDL对象的所有已知列中的Select()方法lambda或默认的一个构建一个选择列表,这个任务我甚至都没想过(我更关注Where解析) .我敢肯定还有很多其他"未知的未知数"可能会把这变成一个非常重要的事情.我找到了几个链接,它们显示了编写Linq提供程序的基础知识,尽管它们都试图使它变得简单,但现在只是时间不可行.我现在将构建我的存储库,使用封装命名查询的命名方法(格式化查询字符串的常量类应该减少维护中的头部刮擦量).不完美,但更可行.如果Linq2SOQL提供商在内部或开源时启动,我们可以重构.
对于寻找Linq提供者参考的其他人,以下是我发现的有用链接:
所以,使用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) 我已经编写了一些测试代码,用于比较使用直接属性访问或使用委托的反射或反射的性能.但是我得到的结果令人费解,因为它表明反射并不比直接属性访问慢得多(约4%),我认为这不是真的.有人能告诉我,我在这里做错了吗?
对于5000件物品,我得到以下结果
码:
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# ×7
performance ×3
.net ×2
architecture ×1
c#-4.0 ×1
collections ×1
datagridview ×1
delegates ×1
generics ×1
linq ×1
mouseevent ×1
reflection ×1
regex ×1
rhino-mocks ×1
salesforce ×1
security ×1
soql ×1
sorting ×1
sql ×1
sql-server ×1
t-sql ×1
winforms ×1