在尝试理解Seq.unfold时,我一直在玩下面的F#,它产生一系列三角形数字......
let tri_seq =
1.0
|> Seq.unfold (fun x -> Some (0.5 * x * (x + 1.0), x + 1.0))
|> Seq.map (fun n -> int n)
Run Code Online (Sandbox Code Playgroud)
这似乎工作正常,因为我可以做以下事情......
tri_seq |> Seq.nth 10
Run Code Online (Sandbox Code Playgroud)
......它显示了正确的数字,无论我传递给它的价值如何.
现在,我正在尝试打印序列中的第一个(比如说)十个值,而不是上面的代码只得到第n个.我试过以下......
tri_seq |> Seq.take 10 |> Seq.map (fun n -> printfn "%d" n)
Run Code Online (Sandbox Code Playgroud)
...但只打印前五个值.无论我使用什么来传递给Seq.take的值,我只得到最多五个结果,即使使用Seq.nth,我可以尽我所能.
有人能向我解释一下吗?为什么我不能超过第五个值?
我正在阅读fsharpforfunandprofit网站上的收集功能之间的选择,他展示了一个例子,说明如何在处理后丢失访问一次性资源(第28节,正好在文章末尾).
他用以下方法模拟了一个数据库......
let dbConnection() =
printfn "Opening connection"
{ new System.IDisposable with
member this.Dispose() =
printfn "Disposing connection"
}
// Read some records from the database
let readCustomersFromDb conn n =
let makeCustomer i =
sprintf "Customer %d" i
seq {
for i = 1 to n do
let customer = makeCustomer i
printfn "Loading %s from the database" customer
yield customer
}
Run Code Online (Sandbox Code Playgroud)
...然后展示如何通过在返回之前枚举序列来避免问题...
let readCustomers() =
use conn = dbConnection()
let results = readCustomersFromDb conn 2
results …Run Code Online (Sandbox Code Playgroud) 我有一个 VS2015 解决方案,其中包含一个服务层,该服务层公开一组 WCF 服务,以及一个使用它们的 WPF 客户端。我已经配置了 log4net 并且在服务层工作正常
我现在想在客户端使用 log4net,因此添加了 log4net NuGet 包,并将节点从服务层的配置文件复制到客户端的 App.config 文件中。完整的文件看起来像这样......
<?xml version="1.0"
encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0"
sku=".NETFramework,Version=v4.5.2" />
</startup>
<log4net>
<appender name="RollingFileAppender"
type="log4net.Appender.RollingFileAppender">
<param name="File"
value="PhysioDiary.log" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="2" />
<maximumFileSize value="1MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-7level %logger - %message%newline%exception" />
</layout>
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="RollingFileAppender" />
</root>
</log4net>
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name="LargeMessageBehavior">
<dataContractSerializer maxItemsInObjectGraph="2147483647" />
</behavior>
</endpointBehaviors> …Run Code Online (Sandbox Code Playgroud) 我有一个使用 log4net 的 WPF 应用程序。当我在 Visual Studio 中运行它时,日志文件会按预期在 Debug 或 Release 文件夹中创建。
但是,当我创建安装程序并运行已安装的应用程序时,不会创建日志文件。我在代码中添加了以下几行...
string logFilePath = ((Hierarchy)LogManager.GetRepository())
.Root.Appenders.OfType<FileAppender>()
.FirstOrDefault()?.File;
using (StreamWriter sw = new StreamWriter(@"d:\log.log")) {
sw.WriteLine("Log file: " + logFilePath);
}
Run Code Online (Sandbox Code Playgroud)
...使我能够检查日志文件是否写入我预期的位置。它告诉我应该将日志文件写入C:\Program Files (x86)\Physio Diary\PhysioDiaryClient.log我所期望的。
但是,该文件不存在。知道为什么吗?
这是 App.config 文件的顶部...
<?xml version="1.0"
encoding="utf-8"?>
<configuration>
<configSections>
<section name="log4net"
type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net" />
</configSections>
<log4net>
<appender name="RollingFileAppender"
type="log4net.Appender.RollingFileAppender">
<param name="File"
value="PhysioDiaryClient.log" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="2" />
<maximumFileSize value="1MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] …Run Code Online (Sandbox Code Playgroud) 使用关于ParallelOptions.MaxDegreeOfParallelism 的MSDN文章中的代码,我尝试了以下内容......
ParallelOptions po = new ParallelOptions {
MaxDegreeOfParallelism = 2
};
Parallel.ForEach(files, (currentFile) => {
String filename = System.IO.Path.GetFileName(currentFile);
Bitmap bitmap = new Bitmap(currentFile);
bitmap.RotateFlip(RotateFlipType.Rotate180FlipNone);
bitmap.Save(Path.Combine(newDir, filename));
Console.WriteLine("Processing {0} on thread {1}", filename, Thread.CurrentThread.ManagedThreadId);
});
Run Code Online (Sandbox Code Playgroud)
但是,查看输出的线程ID,我可以看到,如果我设置了MaxDegreeOfParallelism,它根本没有任何区别.看着我的CPU监视器,即使我将MaxDegreeOfParallelism设置为2,我也能看到所有核心在运行.
我错过了这里的观点吗?我以为这个想法是限制线程的数量?
假设我有以下(基本的和略微无意义的)F#...
type Point = Point of int * int
type MyUnion =
| MyInt of int
| MyString of string
| MyTwoStrings of string * string
| MyPoint of Point
Run Code Online (Sandbox Code Playgroud)
...然后我可以写一个这样的函数......
let MyUnionType myunion =
match myunion with
| MyInt n -> printfn "You gave me an Int (%d)" n
| MyString s -> printfn "You gave me a string (%s)" s
| MyTwoStrings (s1, s2) -> printfn "You gave me two strings (\"%s\", \"%s\")" s1 s2
// Missing case …Run Code Online (Sandbox Code Playgroud) 我正在尝试解决如何GetAll<T>在 Entity Framework Core 中编写通用异步数据库方法而不枚举数据。我想要GetAll<T>异步,但不希望它枚举数据,以便我可以在Where之后添加一个方法,并将其应用于数据库查询..
List<Customer> customers = await _customerRepository.GetAll()
.Where(c => c.Name.StartsWith("a"))
.ToList();
Run Code Online (Sandbox Code Playgroud)
MSDN 关于异步查询的文章显示了以下内容...
public async Task<List<Blog>> GetBlogsAsync()
{
using (var context = new BloggingContext())
{
return await context.Blogs.ToListAsync();
}
}
Run Code Online (Sandbox Code Playgroud)
...但是(如果我理解正确的话)调用ToListAsync()将枚举数据,这意味着它将整个Blogs数据集加载到内存中,然后才应用Where应用于结果的方法将指定的任何过滤。
我可以有一个返回 a 的异步方法IEnumerable<T>吗?
如果这是一个更好的方法,我很高兴不使用存储库。这篇文章表明 EF Core 不会从存储库中受益,但我也看不出如何按照他的方式做我想做的事。
更新:为了澄清(感谢 DavidG),这个想法是我的 ASP.NET Core 控制器可以有一个注入的存储库,并且可以执行异步查询来获取数据。我正在考虑使存储库通用,并在控制器中进行过滤,因此问题。我知道我可以编写一个方法CustomersRepository并拥有一个CustomersThatStartWith方法,但随后存储库变得臃肿。我正在寻找尽可能简单的存储库。
假设我有一个方法如下......
public static async Task DoIt(Func<Task> doit) {
// Do something first
await doit();
// Do something last
}
Run Code Online (Sandbox Code Playgroud)
我可以传递一个可等待的函数,如下所示......
await DoIt(() => Task.Delay(1000));
Run Code Online (Sandbox Code Playgroud)
如果我想传递一些不可等待的东西,我可以这样做......
_ = DoIt(() => Task.Run(() => Console.WriteLine("Hi")));
Run Code Online (Sandbox Code Playgroud)
......但这看起来很丑陋。有没有更简洁的方法来做到这一点?
我正在尝试实现立方根的牛顿法,但我的函数似乎挂起。我的代码与书中显示的平方根代码几乎相同,并根据improve需要修改了函数。
这是我的代码...
(define (cube-root x)
(cube-root-iter 1.0 x))
(define (cube-root-iter guess x)
(if (good-enough? guess x)
guess
(cube-root-iter (improve x guess) x)
)
)
(define (good-enough? guess x)
(< (abs (- (* guess guess) x)) 0.001))
(define (improve x guess)
(/ (+ (/ x (* guess guess)) (* 2 guess)) 3)
)
Run Code Online (Sandbox Code Playgroud)
我进行了独立测试improve,good-enough?他们似乎给出了正确的答案。有人知道为什么我的代码不终止吗?
我在 Racket 中对sicp包进行此操作,以防产生任何影响。
请注意这不是链接的其他问题的副本。这使用了我找不到的类,如下面的问题所述。
我正在尝试将 wma 文件转换为 mp3。我需要一个可以集成到我的代码库中的解决方案,而不是依赖于外部资源,因此使用 ffmpeg 不是一种选择。我一直在尝试 NAudio,但没有任何成功。
一个问题是周围似乎有两个版本的 NAudio,而且似乎都不完整。你从 Nuget 得到的那个不包括 WMAFileReader 类,所以没有办法(我可以看到)读取 wma 文件。github上的版本包含 WMAFileReader 类,但似乎不包含 Mp3Writer 类,也不包含我在许多示例中看到的 WaveLib 类。
那么,有谁知道我怎样才能得到可以完成这项工作的东西?我已经浪费了几个小时尝试不同的代码示例,但它们似乎都不适用于我能找到的任一版本的 NAudio。
理想情况下,我想在内存中执行此操作,但如果我必须写入临时磁盘文件,这并不是世界末日。
编辑我刚刚发现有更多的 NAudio nuget 包扩展了基本的包。有一个用于 Lame,一个用于 WMA,但即使在安装它们之后,我也无法让任何代码工作。
假设我有一个List<string>,其中每个字符串的长度相同。这个长度事先是不知道的,只能通过在运行时检查字符串的 Length 属性(比如第一个,因为它们的长度都相同)来确定。
我想要的是最终得到一组匿名对象,每个对象都有属性 C1、C2 等,每个角色一个。
因此,如果列表中的第一个字符串是“abcd”,那么结果列表中的第一个匿名对象将是...
{
C1 = "a",
C2 = "b",
C3 = "c",
C4 = "d"
}
Run Code Online (Sandbox Code Playgroud)
这可能吗?我一直在与动态和 ExpandoObjects 作斗争,但还没有设法使它们中的任何一个工作。主要问题似乎是事先不知道属性名称。
我尝试做类似的事情(循环)......
d["C" + i] = str.[j];
Run Code Online (Sandbox Code Playgroud)
...但这不起作用,因为它认为我正在尝试使用数组索引。我收到运行时异常“无法将 [] 索引应用于‘System.Dynamic.ExpandoObject’类型的表达式”
这可以做到吗?
我有一个 Blazor 服务器端项目,我一直在 Visual Studio 2019 中使用 .NET5 开发该项目。一切都运转良好。
我刚刚将该站点部署到测试服务器(该服务器上已经运行了两个这样的站点,因此我知道该服务器拥有运行该站点所需的一切),但 Blazor 的东西似乎都不起作用。具体来说...
[Authorize]对任何人都可见不知道要显示什么代码,因为它在 VS 中运行时都有效。App.razor以下是...的内容
<CascadingAuthenticationState>
<Router AppAssembly="@typeof(Program).Assembly">
<Found Context="routeData">
<AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)">
<NotAuthorized>
<RedirectToLogin />
</NotAuthorized>
</AuthorizeRouteView>
</Found>
<NotFound>
<AuthorizeView>
<Authorized>
<LayoutView Layout="@typeof(MainLayout)">
<NotFound />
</LayoutView>
</Authorized>
<NotAuthorized>
<RedirectToLogin />
</NotAuthorized>
</AuthorizeView>
</NotFound>
</Router>
</CascadingAuthenticationState>
Run Code Online (Sandbox Code Playgroud)
该_Imports.razor文件包含所有正确的using内容,特别包括...
@using Microsoft.AspNetCore.Authorization
@using Microsoft.AspNetCore.Components.Authorization
@using Microsoft.AspNetCore.Components.Forms
@using Microsoft.AspNetCore.Components.Routing
@using Microsoft.AspNetCore.Components.Web
Run Code Online (Sandbox Code Playgroud)
非登录用户不应访问的页面[Authorize(Roles = "Admin")]在代码隐藏或@attribute [Authorize(Roles = "Admin")]文件中用 进行修饰 …