与以下列表:
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)
但我仍然没有正确的语法
我有一个带有计时器的测试中心,可以将日期发送给所有客户端。
一旦客户端连接,它就会崩溃并出现以下错误:无法访问已释放的对象。
这是错误:
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#方法返回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)
但它不起作用;“无”不会编译
在 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)
一个实际的例子是这样的情况:
并且您希望避免代码重复,但也希望将代码放在外部函数中。
我有一个库,可以向我发送包含元组的结果。我需要处理一些数据,对其进行序列化,然后将其传送到另一个系统。
元组总是由 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)
我想避免重建整个数据结构并复制所有数据来更改这部分。
有没有办法在序列化器级别将元组转换为列表?
可以轻松更改下一个进程的解析器以容纳列表而不是元组,因此这似乎是最好的方案。
丑陋的选择是用正则表达式修复序列化的字符串,但我真的很想避免这样做。
我有一个简单的清单:
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# 习惯的方法来做到这一点?通过列表功能之一?
假设我有这个:
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)
或者,任何其他允许设置别名的机制?
我想做这样的事情:
let a x : Result<_, string> =
match x with
| 1 -> Ok
| _ -> Error "not 1"
Run Code Online (Sandbox Code Playgroud)
这不会编译。
有没有办法不指定 ok 类型并且不返回任何内容?
我有一个共同的模式:
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#中有这个:
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只是一个静态方法。