这是C#版本:
public static IEnumerable<string> ReadLinesEnumerable(string path) {
using ( var reader = new StreamReader(path) ) {
var line = reader.ReadLine();
while ( line != null ) {
yield return line;
line = reader.ReadLine();
}
}
}
Run Code Online (Sandbox Code Playgroud)
但直接翻译需要一个可变的变量.
我正在测试.Net中的集合有多大.从技术上讲,任何集合对象都可以增长到物理内存的大小.
然后,我测试的服务器,它具有16GB内存下面的代码,运行Windows 2003 Server和Visual Studio 2008,我测试两个F#和C#代码,看了看任务管理器运行时.我可以看到,在增加2GB内存之后,该程序因内存不足异常而崩溃.我确实在属性页面中将目标平台设置为x64.
open System.Collections.Generic
let d = new Dictionary<int, int>()
for i=1 to 1000000000 do
d.Add(i,i)
Run Code Online (Sandbox Code Playgroud)
我对C5集合库进行了相同的测试.结果是C5中的字典可能耗尽整个内存.代码使用C5:
let d = C5.HashDictionary<int, int> ()
for i=1 to 1000000000 do
d.Add(i,i)
Run Code Online (Sandbox Code Playgroud)
谁知道为什么?
在无序列表(例如100)中找到前N个(比如10个)元素的最佳解决方案是什么.
我头脑中的解决方案是1.使用快速排序对其进行排序,2.获得前10名.
但还有更好的选择吗?
我在一家大公司的研究部门工作,我们使用.Net平台来构建我们的原型(这意味着如果原型"有用",产品团队总会重现我们的工作.).
我们还为我们的项目聘请实习生.一些实习生主要做研究,因此编码较少.但无论如何,实习生需要在C#或F#中进行一些编码,如果可以的话.他们中的大多数人之前没有任何C#经验.他们是高年级本科生或毕业生,通常知道一些Java和C++.但他们通常没有接受任何正式的行业质量编程培训.
困难的问题是快速教他们C#/.Net,因为他们应该在3或6个月的实习期间专注于他们的研究问题.此外,他们确实需要了解一些优秀的C#练习,否则实习期间的代码库在实习后无法重复使用.
我学习C#的方式与其他学习方法不同(我首先学习了F#,然后通过C#和有效Java 从头到尾阅读CLR.)所以我想咨询经验丰富的C#用户建议短期(比如,2或3天)C#教程.非常感谢!
我有点了解F#中异步编程的语法.例如
let downloadUrl(url:string) = async {
let req = HttpWebRequest.Create(url)
// Run operation asynchronously
let! resp = req.AsyncGetResponse()
let stream = resp.GetResponseStream()
// Dispose 'StreamReader' when completed
use reader = new StreamReader(stream)
// Run asynchronously and then return the result
return! reader.AsyncReadToEnd() }
Run Code Online (Sandbox Code Playgroud)
在F#专家书(和许多其他来源),他们说喜欢
让!var = expr只是表示"执行异步操作expr并在操作完成时将结果绑定到var.然后继续执行其余的计算主体"
我也知道在执行异步操作时会创建一个新线程.我最初的理解是异步操作后有两个并行线程,一个执行I/O,另一个继续同时执行异步主体.
但在这个例子中,我很困惑
let! resp = req.AsyncGetResponse()
let stream = resp.GetResponseStream()
Run Code Online (Sandbox Code Playgroud)
如果resp
尚未启动并且异步体中的线程想要发生GetResponseStream
什么?这可能是错误吗?
也许我原来的理解是错误的.F#专家书中引用的句子实际上意味着"创建一个新线程,挂起当前线程,当新线程完成时,唤醒正文线程并继续",但在这种情况下我看不到我们可以保存随时.
在最初的理解中,当一个异步块中有多个独立的 IO操作时,可以节省时间,这样它们可以在不相互干预的情况下同时完成.但是在这里,如果我没有得到回复,我就无法创建流; 只有我有流,我可以开始阅读流.获得的时间在哪里?
我正在寻找Scala中可用的F#"案例类"中的等价物.
如果您希望使用方法和字段创建自定义类,并且仍然能够将它们与模式匹配一起使用,则案例类非常有用,如本文 Scala网站所述.
有谁知道F#中是否存在相同的内容?
我想在F#中做一些列表理解.我找到了这个.
let evens n =
{ for x in 1 .. n when x % 2 = 0 -> x }
print_any (evens 10)
let squarePoints n =
{ for x in 1 .. n
for y in 1 .. n -> x,y }
print_any (squarePoints 3)
Run Code Online (Sandbox Code Playgroud)
第一个仍然正常,但第二个已经过时了.最新的(1.9.7.8)F#编译器不支持这种风格.
经过一番搜索,我发现这是有效的
let vec1 = [1;2;3]
let vec2 = [4;5;6]
let products = [for x in vec1 do for y in vec2 do yield x*y]
Run Code Online (Sandbox Code Playgroud)
有人能指出为什么语法改变了?谢谢.
对于OOP语言,有很多书描述了如何设计软件,而设计模式主要用于OOP语言.
我想知道是否有任何书籍/好文章教授如何在一个大项目中使用C,比如当这个函数仅在一个文件中使用时,使用静态函数是一个好习惯.
根据我的经验,.NET比本机代码慢2到3倍.(我实施了L-BFGS进行多变量优化).
我已经在stackoverflow上跟踪广告到 http://www.centerspace.net/products/
速度真的很惊人,速度接近原生代码.他们怎么能这样做?他们说:
问:NMath是"纯粹的".NET吗?
答:答案在某种程度上取决于您对"纯.NET"的定义.NMath是用C#编写的,加上一个小的Managed C++层.但是,为了更好地执行基本线性代数运算,NMath确实依赖于本机Intel Math Kernel Library(包含在NMath中).但是没有COM组件,没有DLL - 只是.NET程序集.此外,在托管C++层中分配并由本机代码使用的所有内存都从托管堆中分配.
有人可以向我解释一下吗?
f# ×6
.net ×3
c# ×3
algorithm ×1
asynchronous ×1
c ×1
java ×1
list ×1
managed-c++ ×1
managed-code ×1
nmath ×1
ocaml ×1
scala ×1
sorting ×1