小编Mar*_*ell的帖子

IEnumerable <T>/IQueryable <T>上的动态LINQ OrderBy

我在动态LINQ 的VS2008示例中找到了一个示例,它允许您使用类似sql的字符串(例如,OrderBy("Name, Age DESC"))用于排序.不幸的是,包含的方法仅适用于IQueryable<T>;.有没有办法获得此功能IEnumerable<T>

c# linq linq-to-objects

657
推荐指数
12
解决办法
26万
查看次数

开关/模式匹配的想法

我最近一直在关注F#,虽然我不太可能在不久的将来跳过障碍,但它肯定会突出一些C#(或库支持)可以让生活更轻松的领域.

特别是,我正在考虑F#的模式匹配功能,它允许非常丰富的语法 - 比当前的开关/条件C#等价物更具表现力.我不会试图给出一个直接的例子(我的F#不符合它),但简而言之它允许:

  • 按类型匹配(对受歧视的联合进行全覆盖检查)[注意这也推断了绑定变量的类型,给成员访问等]
  • 谓词匹配
  • 以上的组合(以及可能我不知道的其他一些场景)

虽然C#最终可以借用[ahem]丰富的一些内容,但是在过渡时期我一直在研究可以在运行时做些什么 - 例如,将一些对象拼凑起来相当容易:

var getRentPrice = new Switch<Vehicle, int>()
        .Case<Motorcycle>(bike => 100 + bike.Cylinders * 10) // "bike" here is typed as Motorcycle
        .Case<Bicycle>(30) // returns a constant
        .Case<Car>(car => car.EngineType == EngineType.Diesel, car => 220 + car.Doors * 20)
        .Case<Car>(car => car.EngineType == EngineType.Gasoline, car => 200 + car.Doors * 20)
        .ElseThrow(); // or could use a Default(...) terminator
Run Code Online (Sandbox Code Playgroud)

其中getRentPrice是Func <Vehicle,int>.

[注意 - 也许这里的Switch/Case是错误的术语......但它显示了这个想法]

对我来说,这比使用重复的if/else或者复合三元条件(对于非平凡的表达式变得非常混乱 - 括号丰富)的等价物要清楚得多.它还避免了大量的转换,并允许简单扩展(直接或通过扩展方法)到更具体的匹配,例如InRange(...)匹配可比VB选择...案例"x到y "用法.

我只是想测量一下,如果人们认为上述结构有很多好处(在没有语言支持的情况下)?

另外请注意,我一直在玩上述3种变体: …

c# switch-statement

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

Javascript - 如何从文件输入控件中提取文件名

当用户选择网页中的文件时,我希望能够仅提取文件名.

我确实尝试过str.search函数,但是当文件名是这样的时候它似乎失败了:c:\ uploads\ilike.this.file.jpg.

如何在没有扩展名的情况下提取文件名?

javascript browser extract

108
推荐指数
9
解决办法
22万
查看次数

如何防止Task上的同步延续?

我有一些库(套接字网络)代码,它Task基于提供基于API的待处理请求响应TaskCompletionSource<T>.然而,TPL中的一个烦恼是,似乎不可能阻止同步延续.我会希望能够做的是两种:

  • 告诉a TaskCompletionSource<T>不应该允许呼叫者附加TaskContinuationOptions.ExecuteSynchronously,或
  • 使用池来设置结果(SetResult/ TrySetResult)以指定TaskContinuationOptions.ExecuteSynchronously应该忽略的方式

具体来说,我遇到的问题是传入的数据正在由专用的阅读器处理,如果调用者可以附加,TaskContinuationOptions.ExecuteSynchronously他们可以阻止阅读器(这不仅影响它们).以前,我通过一些hackery解决了这个问题,它检测是否存在任何延续,如果它们将完成推送到ThreadPool,那么如果调用者已经使工作队列饱和​​,则会产生重大影响,因为完成将不会被处理及时.如果他们使用Task.Wait()(或类似),他们将基本上陷入僵局.同样,这就是读者使用专用线程而不是使用工作者的原因.

所以; 在我尝试唠叨TPL团队之前:我错过了一个选项吗?

关键点:

  • 我不希望外部呼叫者能够劫持我的线程
  • 我不能使用它ThreadPool作为一个实现,因为它需要在池饱和时工作

以下示例生成输出(排序可能因时间而异):

Continuation on: Main thread
Press [return]
Continuation on: Thread pool
Run Code Online (Sandbox Code Playgroud)

问题在于随机调用者设法在"主线程"上获得延续.在实际代码中,这将打断主要读者; 坏事!

码:

using System;
using System.Threading;
using System.Threading.Tasks;

static class Program
{
    static void Identify()
    {
        var thread = Thread.CurrentThread;
        string name = thread.IsThreadPoolThread
            ? "Thread pool" : thread.Name;
        if (string.IsNullOrEmpty(name))
            name = …
Run Code Online (Sandbox Code Playgroud)

.net c# task task-parallel-library async-await

80
推荐指数
2
解决办法
7931
查看次数

使用实体框架进行单元测试

我想测试使用Entity Framework构建的实体.我担心的是使用实体框架意味着直接使用数据源.那么任何想法如何单元测试基于Entity Framework的组件?

linq unit-testing entity-framework

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

在ASP.NET MVC的母版页中使用脚本

我是ASP.NET MVC的新手,我在脚本方面遇到了一些麻烦...特别是我想在大多数页面中使用jQuery,所以将它放在母版页中是有意义的.但是,如果我这样做(来自我~/Views/Shared/Site.Master):

<script src="../../Scripts/jquery-1.2.6.js" type="text/javascript"></script>
Run Code Online (Sandbox Code Playgroud)

那么这就是客户端的真实情况 - 当然只有在我们当前的路线恰好具有正确数量的水平时才有效.开始~/Scripts/...不起作用.与启动/Scripts/...,如果这个项目是在站点根(我不想承担)只会工作.

我有一种工作方法(我将在下面发布) - 但是:我错过了什么吗?

我宁愿不必涉及脚本管理器,因为这似乎打败了ASP.NET MVC模型的简单性......或者我担心太多了?

这是我可以使它工作的方式,这也适用于非平凡的虚拟 - 但它似乎过于复杂:

<script src="<%=Url.Content("~/Scripts/jquery-1.2.6.js")%>" type="text/javascript"></script>
Run Code Online (Sandbox Code Playgroud)

.net asp.net asp.net-mvc scripting

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

如何在.NET运行时调试内部错误?

我正在尝试调试一些处理大文件的工作.代码本身有效,但.NET Runtime本身报告了偶发错误.对于上下文,这里的处理是1.5GB文件(仅加载到内存中一次)被处理并在循环中释放,故意试图重现这个不可预测的错误.

我的测试片段基本上是:

try {
    byte[] data =File.ReadAllBytes(path);
    for(int i = 0 ; i < 500 ; i++)
    {
        ProcessTheData(data); // deserialize and validate

        // force collection, for tidiness
        GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
        GC.WaitForPendingFinalizers();
    }
} catch(Exception ex) {
    Console.WriteLine(ex.Message);
    // some more logging; StackTrace, recursive InnerException, etc
}
Run Code Online (Sandbox Code Playgroud)

(带有一些时间和其他东西)

循环将完全成功地处理非确定性迭代次数- 没有任何问题; 那么这个过程会突然终止.异常处理程序未被命中.测试确实涉及大量的内存使用,但它在每次迭代过程中锯齿非常好(没有明显的内存泄漏,并且我有足够的空间 - 在锯齿的差点处有14GB未使用的主存储器) .该过程是64位.

Windows错误日志包含3个新条目,(通过退出代码80131506)建议执行引擎错误 - 一个讨厌的小动物.一个相关的答案,建议GC错误,用"修复"来禁用并发GC; 但是这个"修复"并不能解决这个问题.

澄清:这个低级错误没有触及CurrentDomain.UnhandledException事件.

澄清:GC.Collect只有监控锯齿状记忆,检查内存泄漏并保持可预测性; 删除它不会使问题消失:它只是使它在迭代之间保持更多内存,并使dmp文件更大; p

通过添加更多的控制台跟踪,我发现它在以下每个过程中出现故障:

  • 在反序列化期间(大量分配等)
  • GC期间(GC"方法"和GC"完成"之间,使用GC通知API)
  • 在验证期间(仅仅是foreach一些数据) …

.net c#

67
推荐指数
2
解决办法
4317
查看次数

反思有多慢

我最近创建了一个接口层来区分DataAccessProvider和业务逻辑层.通过这种方法,我们可以随时通过更改Web/App.Config中的值来更改DataAccessProvider的选择.(如果需要,可以给出更多细节).

无论如何,要做到这一点,我们使用反射来完成我们可以工作的DataProvider类.

/// <summary>
/// The constructor will create a new provider with the use of reflection.
/// If the assembly could not be loaded an AssemblyNotFoundException will be thrown.
/// </summary>
public DataAccessProviderFactory()
{
    string providerName = ConfigurationManager.AppSettings["DataProvider"];
    string providerFactoryName = ConfigurationManager.AppSettings["DataProviderFactory"];
    try
    {
        activeProvider = Assembly.Load(providerName);
        activeDataProviderFactory = (IDataProviderFactory)activeProvider.CreateInstance(providerFactoryName);
    }
    catch
    {
        throw new AssemblyNotFoundException();
    }
}
Run Code Online (Sandbox Code Playgroud)

但现在我想知道反思有多缓慢?

c# reflection performance assemblies

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

.Net项目(Sandcastle)上的命名空间文档?

我不久前开始使用Sandcastle为我们的一个项目生成一个文档网站.它工作得很好,但我们始终只在项目中编写类,方法,属性(...)的文档,并为整个项目和项目部件/模块/命名空间提供完全独立的文档.如果我可以将这些文档合并在一起并将相应的文档添加到生成的帮助文件中,那将是很好的,但我无法弄清楚如何做到这一点.

只是在命名空间声明中添加注释似乎不起作用(C#):

/// <summary>
/// My short namespace description
/// </summary>
namespace MyNamespace { ... }
Run Code Online (Sandbox Code Playgroud)

有谁知道如何做到这一点?我知道有可能以某种方式,这将是非常好的... :)

.net documentation sandcastle

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

使用Protobuf-net,我突然得到一个关于未知线型的例外

(这是我在我的RSS中看到的一个问题的重新发布,但被OP删除了.我重新添加了它,因为我已经在不同的地方多次询问过这个问题; wiki为"好"形成")

突然间,我ProtoException在反序列化时收到了一个消息:未知的线型6

  • 什么是线型?
  • 有哪些不同的线型值及其描述?
  • 我怀疑一个字段导致了问题,如何调试这个?

c# protobuf-net

60
推荐指数
4
解决办法
5万
查看次数