我在动态LINQ 的VS2008示例中找到了一个示例,它允许您使用类似sql的字符串(例如,OrderBy("Name, Age DESC"))
用于排序.不幸的是,包含的方法仅适用于IQueryable<T>
;.有没有办法获得此功能IEnumerable<T>
?
我最近一直在关注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种变体: …
当用户选择网页中的文件时,我希望能够仅提取文件名.
我确实尝试过str.search函数,但是当文件名是这样的时候它似乎失败了:c:\ uploads\ilike.this.file.jpg.
如何在没有扩展名的情况下提取文件名?
我有一些库(套接字网络)代码,它Task
基于提供基于API的待处理请求响应TaskCompletionSource<T>
.然而,TPL中的一个烦恼是,似乎不可能阻止同步延续.我会希望能够做的是两种:
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) 我想测试使用Entity Framework构建的实体.我担心的是使用实体框架意味着直接使用数据源.那么任何想法如何单元测试基于Entity Framework的组件?
我是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 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
通过添加更多的控制台跟踪,我发现它在以下每个过程中出现故障:
foreach
一些数据) …我最近创建了一个接口层来区分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)
但现在我想知道反思有多缓慢?
我不久前开始使用Sandcastle为我们的一个项目生成一个文档网站.它工作得很好,但我们始终只在项目中编写类,方法,属性(...)的文档,并为整个项目和项目部件/模块/命名空间提供完全独立的文档.如果我可以将这些文档合并在一起并将相应的文档添加到生成的帮助文件中,那将是很好的,但我无法弄清楚如何做到这一点.
只是在命名空间声明中添加注释似乎不起作用(C#):
/// <summary>
/// My short namespace description
/// </summary>
namespace MyNamespace { ... }
Run Code Online (Sandbox Code Playgroud)
有谁知道如何做到这一点?我知道有可能以某种方式,这将是非常好的... :)
(这是我在我的RSS中看到的一个问题的重新发布,但被OP删除了.我重新添加了它,因为我已经在不同的地方多次询问过这个问题; wiki为"好"形成")
突然间,我ProtoException
在反序列化时收到了一个消息:未知的线型6
c# ×6
.net ×4
linq ×2
asp.net ×1
asp.net-mvc ×1
assemblies ×1
async-await ×1
browser ×1
extract ×1
javascript ×1
performance ×1
protobuf-net ×1
reflection ×1
sandcastle ×1
scripting ×1
task ×1
unit-testing ×1