小编Avr*_*oel的帖子

为什么我不能Seq.take超过5个值?

在尝试理解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,我可以尽我所能.

有人能向我解释一下吗?为什么我不能超过第五个值?

f#

2
推荐指数
1
解决办法
83
查看次数

Seq.toList和List.ofSeq有什么区别?

我正在阅读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)

f#

2
推荐指数
1
解决办法
1050
查看次数

尝试配置 log4net 时出现 TypeInitializationException

我有一个 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)

c# wpf log4net log4net-configuration

2
推荐指数
1
解决办法
3793
查看次数

部署应用程序时未写入 log4net 日志文件

我有一个使用 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)

wpf log4net

2
推荐指数
1
解决办法
363
查看次数

seq.nth 和 seq.item 有什么区别?

查看Seq.nthSeq.item的 MSDN 文档,它们似乎做了完全相同的事情。两者具有相同的描述...计算集合中的第 n 个元素

有什么不同?如果没有之一,为什么两者都有呢?

f#

2
推荐指数
1
解决办法
829
查看次数

ParallelOptions.MaxDegreeOfParallelism没有做任何事情

使用关于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,我也能看到所有核心在运行.

我错过了这里的观点吗?我以为这个想法是限制线程的数量?

c# task-parallel-library parallel.foreach

1
推荐指数
1
解决办法
441
查看次数

如何分解作为类型的歧视联合?

假设我有以下(基本的和略微无意义的)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)

f# discriminated-union

1
推荐指数
2
解决办法
246
查看次数

如何在不枚举数据的情况下进行异步查询?

我正在尝试解决如何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方法,但随后存储库变得臃肿。我正在寻找尽可能简单的存储库。

c# asynchronous entity-framework-core

1
推荐指数
1
解决办法
1102
查看次数

如何将不可等待的操作传递给采用 Func&lt;Task&gt; 的方法?

假设我有一个方法如下......

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)

......但这看起来很丑陋。有没有更简洁的方法来做到这一点?

c# async-await

1
推荐指数
1
解决办法
95
查看次数

SICP 练习 1.8 - 为什么我的函数没有终止?

我正在尝试实现立方根的牛顿法,但我的函数似乎挂起。我的代码与书中显示的平方根代码几乎相同,并根据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)

我进行了独立测试improvegood-enough?他们似乎给出了正确的答案。有人知道为什么我的代码不终止吗?

我在 Racket 中对sicp包进行此操作,以防产生任何影响。

scheme sicp racket

1
推荐指数
1
解决办法
122
查看次数

如何使用 NAudio 从 wma 转换为 mp3

请注意这不是链接的其他问题的副本。这使用了我找不到的类,如下面的问题所述。

我正在尝试将 wma 文件转换为 mp3。我需要一个可以集成到我的代码库中的解决方案,而不是依赖于外部资源,因此使用 ffmpeg 不是一种选择。我一直在尝试 NAudio,但没有任何成功。

一个问题是周围似乎有两个版本的 NAudio,而且似乎都不完整。你从 Nuget 得到的那个不包括 WMAFileReader 类,所以没有办法(我可以看到)读取 wma 文件。github上版本包含 WMAFileReader 类,但似乎不包含 Mp3Writer 类,也不包含我在许多示例中看​​到的 WaveLib 类。

那么,有谁知道我怎样才能得到可以完成这项工作的东西?我已经浪费了几个小时尝试不同的代码示例,但它们似乎都不适用于我能找到的任一版本的 NAudio。

理想情况下,我想在内存中执行此操作,但如果我必须写入临时磁盘文件,这并不是世界末日。

编辑我刚刚发现有更多的 NAudio nuget 包扩展了基本的包。有一个用于 Lame,一个用于 WMA,但即使在安装它们之后,我也无法让任何代码工作。

c# mp3 wma naudio

0
推荐指数
1
解决办法
4132
查看次数

如何将字符串列表转换为每个字符都有一个属性的匿名类型

假设我有一个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’类型的表达式”

这可以做到吗?

c# dynamic expandoobject

0
推荐指数
1
解决办法
673
查看次数

Blazor 服务器应用程序在部署时无法工作,但在 Visual Studio 中工作正常

我有一个 Blazor 服务器端项目,我一直在 Visual Studio 2019 中使用 .NET5 开发该项目。一切都运转良好。

我刚刚将该站点部署到测试服务器(该服务器上已经运行了两个这样的站点,因此我知道该服务器拥有运行该站点所需的一切),但 Blazor 的东西似乎都不起作用。具体来说...

  • 单击按钮不会执行任何操作
  • 单击链接会刷新整个页面,而不仅仅是呈现新的 HTML
  • 授权似乎被忽略了,因此具有属性的页面[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")]文件中用 进行修饰 …

blazor blazor-server-side

0
推荐指数
1
解决办法
1565
查看次数