小编Tho*_*mas的帖子

使用 linq 对字典中的重复项进行分组和计数

与以下列表:

a
a
b
b
b
c
Run Code Online (Sandbox Code Playgroud)

我想使用 linq 制作一本字典,其中包含:

a => 2
b => 3
c => 1
Run Code Online (Sandbox Code Playgroud)

现在我有:

var Q = (from l in List
        group l by l into g
        let Count = g.Count()
        select new { Key = g.Key, Value = Count})
Run Code Online (Sandbox Code Playgroud)

我如何把它变成字典?

编辑:我将最后一行更改为:

select new Dictionary<string, int> { g.Key, Count });
Run Code Online (Sandbox Code Playgroud)

但我仍然没有正确的语法

c# linq

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

SignalR 中“无法访问已处置的对象”崩溃

我有一个带有计时器的测试中心,可以将日期发送给所有客户端。

一旦客户端连接,它就会崩溃并出现以下错误:无法访问已释放的对象。

这是错误:

System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'MyHub'.
   at Microsoft.AspNetCore.SignalR.Hub.CheckDisposed()
   at Microsoft.AspNetCore.SignalR.Hub.get_Clients()
Run Code Online (Sandbox Code Playgroud)

这是中心代码:

public class MyHub : Hub
{
    public MyHub()
    {
        Program.T = new Timer(TickTimer, null, 1000, 1000);
    }

    private void TickTimer(object State)
    {
        try
        {
            var Time = DateTime.UtcNow.ToString(CultureInfo.InvariantCulture);
            Console.WriteLine(Time);

            Clients.All.SendCoreAsync("update", new object[] { Time });
        }
        catch (Exception E)
        {
            Console.WriteLine(E);
            throw;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

看起来Clients对象已被处理,但我不明白为什么。


编辑,这里有更多信息:

集线器可以来自不同的程序集,因此它们在 asp 启动的配置部分动态注册。

每个集线器都用一个属性来装饰以识别它并提供路径:

[AttributeUsage(AttributeTargets.Class)]
public class SignalRHub : Attribute
{
    public readonly …
Run Code Online (Sandbox Code Playgroud)

c# signalr

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

如何在F#中使用C#可为null的日期时间

我有C#方法返回DateTime吗?

并且我想做相当于:

DateTime? D;
if (D == null)
{
    ...
}
else
{
    Date = (DateTime)D;
    ...
}
Run Code Online (Sandbox Code Playgroud)

但是在F#中

如何才能做到这一点?


我尝试了这个:

    match (d: Nullable<DateTime>) with
    | None -> printfn "null"
    | NonNull s -> printfn "d %s" s.ToString
Run Code Online (Sandbox Code Playgroud)

但它不起作用;“无”不会编译

f#

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

在 F# 中,匹配表达式可以“通过”另一个匹配吗?就像在 C# 或 C++ 中一样?

在 C++ 中,您可以使用 switch / case 构造并省略 case 语句中的 break 以使执行在下一个 case 中失败。

在 C# 中,这是通过 goto 案例完成的。

这可以在 F# 中完成吗?

AC#示例来说明:

switch (a)
case "a":
    ...
    break;
case "b":
    ...
    goto case "a"
case "c":
    ...
Run Code Online (Sandbox Code Playgroud)

我会想象这样的事情:

match x with
| "a" -> ...
| "b" -> ...  + goto "a"
Run Code Online (Sandbox Code Playgroud)

一个实际的例子是这样的情况:

  • "a" 做一些操作
  • "b" 重置计数器,然后执行与 "a" 相同的操作

并且您希望避免代码重复,但也希望将代码放在外部函数中。

f# switch-statement

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

如何在 F# 中将元组序列化为列表?

我有一个库,可以向我发送包含元组的结果。我需要处理一些数据,对其进行序列化,然后将其传送到另一个系统。

元组总是由 2 个值组成,但是在序列化时它们非常浪费:

(3, 4)
Run Code Online (Sandbox Code Playgroud)

将序列化为:

{"Item1":3,"Item2":4}
Run Code Online (Sandbox Code Playgroud)

然而

[3; 4]
Run Code Online (Sandbox Code Playgroud)

将序列化为:

[3,4]
Run Code Online (Sandbox Code Playgroud)

我想避免重建整个数据结构并复制所有数据来更改这部分。

有没有办法在序列化器级别将元组转换为列表?

可以轻松更改下一个进程的解析器以容纳列表而不是元组,因此这似乎是最好的方案。

丑陋的选择是用正则表达式修复序列化的字符串,但我真的很想避免这样做。

serialization f# json.net

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

在 F# 中计算列表中未更改的元素数量

我有一个简单的清单:

let l = [ 1; 1; 1; 1; 2; 1; 1; 1 ]
Run Code Online (Sandbox Code Playgroud)

我想知道有多少元素与第一个匹配,没有中断(示例中为 4)

let mutable i = 0
while l.[i] = l.[0] do
    i <- i + 1
Run Code Online (Sandbox Code Playgroud)

但是有没有更符合 F# 习惯的方法来做到这一点?通过列表功能之一?

f#

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

是否可以在 F# 中使用另一个名称为模块设置别名

假设我有这个:

module A =
    let a () =
        printfn "%A" DateTime.UtcNow
Run Code Online (Sandbox Code Playgroud)

有没有办法做类似的事情

type B = A
B.a()
Run Code Online (Sandbox Code Playgroud)

或者,任何其他允许设置别名的机制?

f#

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

在 F# 中使用没有类型的 Result&lt;&gt;

我想做这样的事情:

let a x : Result<_, string> =
    match x with
    | 1 -> Ok
    | _ -> Error "not 1"
Run Code Online (Sandbox Code Playgroud)

这不会编译。

有没有办法不指定 ok 类型并且不返回任何内容?

f#

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

在 F# 属性中使用 lazy 会阻止代码在不应该被评估时被评估吗?

我有一个共同的模式:

type something =
    {
        ... a lot of stuff
    }

    member this.Description =
        "a string description of the content, can be long tables, etc"
Run Code Online (Sandbox Code Playgroud)

我希望仅在需要时才对 Description 属性进行评估;在许多情况下,它不会被使用,但它可以(主要是根据用户的要求)。

我注意到即使不需要此代码,它也会导致对 Description 进行评估。所以我把代码移到了一个函数:Describe() 就解决了这个问题。

当我重构时,我正在重新审视这个。虽然它在实践中不会让任何事情变得更好,但我想知道是否有类似的东西:

member this.Describe =
    (lazy "the long to build text output").Value
Run Code Online (Sandbox Code Playgroud)

会解决问题吗?因为惰性对象将被创建,但没有任何东西可以查询值本身。

那会可靠地工作吗?

f# lazy-evaluation

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

从C#调用并等待F#异步方法

我在F#中有这个:

type RuleStore() =

    ...
    static member LoadAsync : Async<RulesStore> =
        async {
            let! r = Startup.States.GetAsStringAsync("rules") |> Async.AwaitTask

            return
                if String.IsNullOrEmpty r then
                    new RulesStore()
                else
                    JsonConvert.DeserializeObject<RulesStore>(r);
        }
Run Code Online (Sandbox Code Playgroud)

我试图从C#调用它,但是语法似乎不起作用。

NewRules =等待Rules.RulesStore.LoadAsync();

我得到的错误是:

Core.cs(29,38):[CS1955]不可发音的成员'Rules.RulesStore.LoadAsync'不能像方法一样使用。

我不太了解,因为我觉得LoadAsync只是一个静态方法。

c# f# asynchronous

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