Levenshtein在C#和F#中的实现.对于两个大约1500个字符的字符串,C#版本快10倍.C#:69 ms,F#867 ms.为什么?据我所知,他们完全一样吗?无论是Release还是Debug构建都无关紧要.
编辑:如果有人来这里专门寻找编辑距离实施,它就会被打破.工作代码在这里.
C#:
private static int min3(int a, int b, int c)
{
return Math.Min(Math.Min(a, b), c);
}
public static int EditDistance(string m, string n)
{
var d1 = new int[n.Length];
for (int x = 0; x < d1.Length; x++) d1[x] = x;
var d0 = new int[n.Length];
for(int i = 1; i < m.Length; i++)
{
d0[0] = i;
var ui = m[i];
for (int j = 1; j < n.Length; j++ )
{ …Run Code Online (Sandbox Code Playgroud) 我需要在Sql中运行.Net代码,我试图在F#和C#之间做出决定.我现在在F#中做的代码越来越多,所以如果它不是太不切实际,我希望它是F#.
是否有可能强制VS2010将我的F#程序集(及其引用)部署到Sql Server,这与C#项目的做法相同?
你会建议/不建议在Sql中运行F#吗?为什么?
编辑: 我同意语言更好,这不是问题.我主要想知道是否有人在SqlClr中使用F#的经验,特别是如果工具可以提供简单的开发工作流程,即在VS2010中部署.
编辑2:
我正在尝试这个,手动注册是非常痛苦的.此外,CREATE ASSEMBLY你必须注册每个函数,sp,聚合等.你还必须先按正确的顺序删除它们,如果它们存在,以免你得到一个DROP ASSEMBLY failed because 'Nibbler' is referenced by object 'Hello'.
然后,我有了使用C#项目作为前端的想法,让这个项目引用一个F#项目,只是为了让所有这些部署自动处理.事实证明,您只能引用其他C#/ VB Sql Clr项目或已在Sql中引用的程序集.这仍然可以简化部署,因为所有功能的创建/删除等都将自动处理.然后,为了从测试部署到生产,我只会从我的测试环境中注册的所有内容生成脚本.
PS.我还尝试摆弄.fsproj文件,与C#Clr项目的.csproj进行区分,以使部署无济于事.
在我们当前的WinForms应用程序中,我们使用虚拟化在ListView中显示数百万条记录.在请求时从DB加载行.这很好,性能很好.
这是一个为我们迁移到WPF的showstopper.我们需要在ListView中进行数据虚拟化,就像WinForms 2.0一样.
你知道一个体面的第三方控件,或者使用内置控件进行相对简单的方法吗?它不需要是一个DataGrid,一个简单的ListView就足够了.
请注意,我注意到了UI虚拟化,它是数据虚拟化.
我有三个应该是平等的功能:
let add1 x = x + 1
let add2 = (+) 1
let add3 = (fun x -> x + 1)
Run Code Online (Sandbox Code Playgroud)
为什么这些方法的类型不同?
add1和add3是int -> int,但add2是(int -> int).他们都按预期工作,我只是好奇为什么FSI以不同的方式呈现它们?
在TFS 2012中,有一种新的本地工作空间模式.
这是个好消息:
但这也意味着我需要一种方法来告诉TFS在监视文件系统进行更改时要忽略哪些文件.在TFS2012中如何处理?
Transact-SQL表值函数将调用函数的结果实现为中间表....相反,CLR表值函数表示流式替代.不要求在单个表中实现整个结果集.托管函数返回的IEnumerable对象由调用表值函数的查询的执行计划直接调用,结果以增量方式使用....如果返回的行数非常多,它也是一个更好的选择,因为它们不必在整个内存中实现.
然后我发现"填充行"方法中不允许任何数据访问.这意味着您仍然必须在init方法中执行所有数据访问并将其保留在内存中,等待调用"填充行".我误解了什么吗?如果我不将结果强制转换为数组或列表,则会出现错误:'ExecuteReader需要一个开放且可用的连接.连接的当前状态已关闭.
代码示例:
[<SqlFunction(DataAccess = DataAccessKind.Read, FillRowMethodName = "Example8Row")>]
static member InitExample8() : System.Collections.IEnumerable =
let c = cn() // opens a context connection
// I'd like to avoid forcing enumeration here:
let data = getData c |> Array.ofSeq
data :> System.Collections.IEnumerable
static member Example8Row ((obj : Object),(ssn: SqlChars byref)) =
do ssn <- new SqlChars(new SqlString(obj :?> string))
()
Run Code Online (Sandbox Code Playgroud)
我在这里处理几百万行.有没有办法懒惰地这样做?
我想在F#中使用.NET CLR版本的String.Split.具体来说我想使用这段代码:
let main argv =
let s = "Now is the time for FOO good men to come to the aide of their country"
let sepAry = [|"FOO"; "BAR"|]
let z1 = s.Split sepAry
0 // return an integer exit code
Run Code Online (Sandbox Code Playgroud)
然而,由于(我相信)F#中的Split版本的实现方式与.Net 4.5中的版本不同,因此无法编译.我想要的.NET版本是:
Split(String [],StringSplitOptions)返回一个字符串数组,该数组包含此字符串中的子字符串,这些子字符串由指定字符串数组的元素分隔.参数指定是否返回空数组元素.
我知道我得到的是F#版本的Split,以前存在于PowerPack中,这就是为什么实现与CLR版本不同的原因.
得到我想要的最好的方法是什么?是否可以覆盖F#版本的Split并使用.Net版本?是否有可能扩展F#版本,如果是这样,如何?
我理解它的方式,C#5 CTP中新的Async-Await功能应该全部在编译器中实现.这应该意味着使用CTP编译的代码应该能够在vanilla .Net 4上运行吗?
它可以?
在 Microsoft Sql Server 中,有一个 proc sys.sp_describe_first_result_set,它接受一个任意的 sql 查询字符串并返回描述结果集中的类型的数据,如果它被执行。请注意,这是描述复杂查询的结果,而不是表。MSDN参考
Postgres 有类似的东西吗?
f# ×5
c# ×3
sql-server ×3
performance ×2
sqlclr ×2
async-await ×1
async-ctp ×1
f#-3.0 ×1
inline ×1
listview ×1
mercurial ×1
postgresql ×1
syntax ×1
tfs ×1
tfs2012 ×1
transplant ×1
wpf ×1