小编Bre*_*ias的帖子

使用.NET的CSV解析选项

我正在查看我的分隔文件(例如CSV,tab分离等)解析选项,一般基于MS堆栈,特别是.net.我排除的唯一技术是SSIS,因为我已经知道它不能满足我的需求.

所以我的选择似乎是:

  1. Regex.Split
  2. TextFieldParser
  3. OLEDB CSV解析器

我有两个必须符合的标准.首先,给定以下文件,其中包含两个逻辑数据行(以及共五个物理行):

101, Bob, "Keeps his house ""clean"".
Needs to work on laundry."
102, Amy, "Brilliant.
Driven.
Diligent."

解析后的结果必须产生两个逻辑"行",每行包含三个字符串(或列).第三行/列字符串必须保留换行符!换句话说,由于"未闭合"文本限定符,解析器必须识别行何时"继续"到下一个物理行上.

第二个标准是每个文件的分隔符和文本限定符必须是可配置的.以下是两个字符串,取自不同的文件,我必须能够解析:

var first = @"""This"",""Is,A,Record"",""That """"Cannot"""", they say,"","""",,""be"",rightly,""parsed"",at all";
var second = @"~This~|~Is|A|Record~|~ThatCannot~|~be~|~parsed~|at all";
Run Code Online (Sandbox Code Playgroud)

正确解析字符串"first"将是:

  • 这个
  • 是,A,记录
  • 他们说,"不能"
  • _
  • _
  • 正当地
  • 解析的
  • 一点都不

'_'仅表示捕获了空白 - 我不希望出现文字下划线.

可以对要解析的平面文件做出一个重要的假设:每个文件将有固定数量的列.

现在深入了解技术方案.

正则表达式

首先,许多响应者评论说正则表达式"不是实现目标的最佳方式".但是,我确实找到了一位提供优秀CSV正则表达式评论者:

var regex = @",(?=(?:[^""]*""[^""]*"")*(?![^""]*""))";
var Regex.Split(first, regex).Dump();
Run Code Online (Sandbox Code Playgroud)

应用于字符串"first"的结果非常精彩:

  • "这个"
  • "是,A,记录"
  • 他们说,"那个""不能"","
  • ""
  • _
  • "是"
  • 正当地
  • "解析"
  • 一点都不

如果清除报价会很好,但我可以轻松地将其作为后处理步骤来处理.否则,此方法可用于解析样本字符串"first"和"second",前提是相应地修改了正则表达式和管道符号.优秀!

但真正的问题与多线标准有关.在将正则表达式应用于字符串之前,我必须从文件中读取完整的逻辑"行".不幸的是,我不知道要读取多少物理行来完成逻辑行,除非我有一个正则表达式/状态机.

所以这成了"鸡与鸡蛋"的问题.我最好的选择是将整个文件作为一个巨大的字符串读入内存,让正则表达式排序多行(我没有检查上面的正则表达式是否可以处理).如果我有一个10 gig文件,这可能有点不稳定. …

.net c# parsing

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

性能测试与单元测试

我正在阅读Osherove的"单元测试艺术",虽然我还没有看到他对性能测试有任何说法,但我还是想到了两个想法:

  • 性能测试通常不能进行单元测试,因为性能测试通常需要长时间运行.
  • 性能测试通常不能进行单元测试,因为性能问题经常出现在集成或系统级别(或者至少重新创建集成环境性能所需的单个单元测试的逻辑太过于复杂单元测试).

特别是出于上述第一个原因,我怀疑单元测试框架(例如NUnit)处理性能测试是否有意义.

我的问题是:我的发现/倾向是否符合社区的想法?

performance unit-testing

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

包括文件订购策略

我已经看到了相当一致的意见,实现文件(的.cc /的.cpp)应包括其对应的类定义文件第一个,包括其他头文件之前.但是当主题转移到头文件本身,以及它们包含的包含顺序时,建议似乎有所不同.

Google编码标准建议:

  1. dir2/foo2.h(首选位置 - 见下面的详细信息).
  2. C系统文件.
  3. C++系统文件.
  4. 其他库的.h文件.
  5. 你的项目的.h文件.

目前尚不清楚上述第1项和第5项之间的差异,以及选择其中一个或另一个地点的原因.也就是说,另一个在线指南建议这个顺序(在该文档的"类布局"部分中找到):

  1. 系统包括
  2. 项目包括
  3. 当地包括

再次出现歧义,这次是第2项和第3项之间的区别.有什么区别?那些代表项目间和项目内部是否包括?

但更重要的是,看起来两个提议的编码标准都建议最后包含"你的"头文件.这些建议与实施文件中包含排序的建议相反,并不直观.将"你的"头文件始终列在第一位 - 在系统和第三方标题之前是否没有意义?

c++ coding-style include header-files

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

将LINQ表达式转换为没有DB Context的SQL Text

LINQ to SQL或LINQ to Entities已经能够将LINQ转换为SQL文本字符串.但是我希望我的应用程序在不使用db上下文的情况下进行转换 - 这反过来意味着一个活动的数据库连接 - 这两个提供者都需要.

我想将LINQ表达式转换为等效的SQL字符串for WHEREORDER BYclauses,而不需要DB上下文依赖项,以使以下存储库接口工作:

public interface IStore<T> where T : class 
{
     void Add(T item);
     void Remove(T item);
     void Update(T item);
     T FindByID(Guid id);

     //sure could use a LINQ to SQL converter!
     IEnumerable<T> Find(Expression<Func<T, bool>> predicate);
     IEnumerable<T> FindAll();
}
Run Code Online (Sandbox Code Playgroud)

它主要是我感兴趣的表达式树遍历和变换.有没有人知道我可以合并的现有库(nuget?)在这样的自定义上下文中使用?

因为它已经构建了我自己的工作"LINQ转换为SQL文本"工具,类似于这个表达式树到SQL示例,它在我上面的存储库中工作.它允许我编写这样的代码:

IRepository<Person> repo = new PersonRepository();
var maxWeight = 170;
var results = repo.Find(x => (x.Age > 40 || x.Age < 20) && x.Weight < maxWeight); …
Run Code Online (Sandbox Code Playgroud)

.net c# sql linq expression-trees

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

MvcBuildViews与Razor Generator

使用.csproj设置MvcBuildViews和使用Razor Generator实现相同的功能有什么区别?

我自己的假设是,MvcBuildViews不会使单元测试可用的视图智能化,但可能存在其他差异?

.net c# asp.net-mvc unit-testing razor

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

清理TPL中的CallContext

根据我是使用基于异步/等待的代码还是基于TPL的代码,我在逻辑清理方面有两种不同的行为CallContext.

CallContext如果我使用以下async/await代码,我可以完全按照我的预期设置和清除逻辑:

class Program
{
    static async Task DoSomething()
    {
        CallContext.LogicalSetData("hello", "world");

        await Task.Run(() =>
            Debug.WriteLine(new
            {
                Place = "Task.Run",
                Id = Thread.CurrentThread.ManagedThreadId,
                Msg = CallContext.LogicalGetData("hello")
            }))
            .ContinueWith((t) =>
                CallContext.FreeNamedDataSlot("hello")
                );

        return;
    }

    static void Main(string[] args)
    {
        DoSomething().Wait();

        Debug.WriteLine(new
        {
            Place = "Main",
            Id = Thread.CurrentThread.ManagedThreadId,
            Msg = CallContext.LogicalGetData("hello")
        });

    }
}
Run Code Online (Sandbox Code Playgroud)

以上输出如下:

{Place = Task.Run,​​Id = 9,Msg = world}
{Place = Main,Id = 8,Msg =}

注意,Msg =这表明CallContext主线程已被释放且为空.

但是,当我切换到纯TPL/TAP代码时,我无法达到同样的效果......

class Program
{ …
Run Code Online (Sandbox Code Playgroud)

c# asynchronous task task-parallel-library async-await

11
推荐指数
2
解决办法
3111
查看次数

以编程方式插入性能分析标记

我正在使用Visual Studio 2008开发版的Profiler.要执行"有针对性的分析",我可以在附加到当前运行的测试代码的任何时候通过"标记"手动设置分析器过滤器.但我想以编程方式插入标记.我想在我的测试代码中添加一个调用,指令或指令,当执行时,它会告诉探查器"这是一个'标记',称为'BeginWork'"和"这是一个'标记',称为'EndWork'".

有没有办法做到这一点?如果没有,Visual Studio 2010是否具备该功能?

.net profiler profiling visual-studio

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

(自动)依赖注入绑定机制

创建依赖注入绑定的两种常见机制(例如通过IOC容器)来自XML配置或命令式代码块.在这些情况下,键值对是显式的(即键=请求类型,值=返回类型).

仍然有第三种"启发式"方法,其中应用程序/ IOC容器仅被赋予[IMyClass]键,然后容器反映一组应用程序组件依赖项以查找所有名称匹配的具体类[MyClass].换句话说,发现"返回类型"值而不是声明.

我想知道的是双重的:

  1. 哪些IOC容器(或其他后期绑定工具)允许启发式方法?这种方法有更常见的名称吗?
  2. 是否有其他绑定技术,除了我列出的三个,在实践中使用?

.net c# dependency-injection ioc-container late-binding

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

MVC"添加控制器"是"无法检索元数据...配置系统无法初始化"

从头开始,我用两个项目创建了一个新的解决方案:一个是MVC 3,另一个是支持EF 4.2项目.整个事情成功建立.从MVC项目中,我打开"添加控制器"对话框,让它根据我从支持的EF项目中选择的上下文和模型生成代码."添加控制器"对话框失败,并显示以下消息:

无法检索"MyModelClass"的元数据.配置系统无法初始化.

我注意到"添加控制器"对话框实际上是在尝试从其web.config文件中获取数据库连接字符串.首先,由于支持EF项目已经有一个带有连接字符串的app.config,这让我觉得很愚蠢.但是从来没有意识到,我能想到的最好的是web.config中的连接字符串不知何故.这就是它的样子:

<add name="Monsters2Entities" 

    connectionString="
      metadata=res://*/Monsters.csdl|
               res://*/Monsters.ssdl|
               res://*/Monsters.msl;
      provider=System.Data.SqlClient;
      provider connection string=&quot;
        data source=.;
        initial catalog=Monsters2;
        integrated security=True;
        pooling=False;
        multipleactiveresultsets=True;
        App=EntityFramework
      &quot;" 
      providerName="System.Data.EntityClient" 
/>
Run Code Online (Sandbox Code Playgroud)

连接字符串实际上没有所有荒谬的换行符和缩进 - 我只是想让它更容易阅读.无论如何,该连接字符串基本上与在其上建模的支持EF项目中使用的连接字符串相同.如何纠正这种情况,让"添加控制器"拨号开心?

asp.net-mvc entity-framework visual-studio

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

什么是EF重写规则?

当使用DBContext编写LINQ查询语法表达式时,C#编译器会使用其18个转换/术语重写规则列表将其查询语法转换为点/扩展语法.然后,当执行查询时,EF应用其自己的内部重写规则来生成SQL表达式.

就像我上面链接的文章一样,我想要列出EF正在应用的重写规则.我在哪里可以找到它?如果我知道EF重写规则,我可以预测SQL EF将为给定查询生成什么,而不必等到运行时"看到"生成的SQL.

例如,请考虑以下两个查询:

var result = from c in context.Customers
             from a in c.Accounts
             where c.ID > 2
             select a;

var result = from c in context.Customers
             where c.ID > 2
             from a in c.Accounts
             select a;
Run Code Online (Sandbox Code Playgroud)

当C#编译器完成自己的重写规则时,上述查询将转换为带有以下各种格式的点表示法:

SelectMany(...).Where(...).Select(...); //for the first query

Where(...).SelectMany(...); // for the second query
Run Code Online (Sandbox Code Playgroud)

在这些转换之后,EF开始应用自己的重写规则.但是EF对于上述两个查询都有一个标准化形式.换句话说,两个查询都会产生相同的结果; 任一查询都会生成以下SQL语句:

SELECT 
    [Extent1].[ID] AS [ID], 
    [Extent1].[Name] AS [Name], 
    [Extent1].[Stat_ID] AS [Stat_ID]
    FROM  [dbo].[Customers] AS [Extent1]
    INNER JOIN [dbo].[Accounts] AS [Extent2] ON [Extent1].[ID] = [Extent2].[Customer_ID]
    WHERE [Extent2].[ID] > …
Run Code Online (Sandbox Code Playgroud)

c# sql linq code-generation entity-framework

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