众所周知,Enumerable.SelectMany将序列序列展平为单个序列.如果我们想要一种能够使序列序列序列变平,等等递归的方法怎么办?
我很快就提出了一个实现使用ICollection<T>,即急切评估,但我仍然在摸索如何使用yield关键字进行懒惰评估.
static List<T> Flatten<T>(IEnumerable list) {
var rv = new List<T>();
InnerFlatten(list, rv);
return rv;
}
static void InnerFlatten<T>(IEnumerable list, ICollection<T> acc) {
foreach (var elem in list) {
var collection = elem as IEnumerable;
if (collection != null) {
InnerFlatten(collection, acc);
}
else {
acc.Add((T)elem);
}
}
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?任何.NET语言欢迎中的示例.
我正在使用avcodec_decode_video2函数.在流中的编码更改时,它返回-1094995529.文档仅说明:
出错时,返回负值,否则使用的字节数,如果没有帧可以解压缩,则返回零.
但似乎没有返回代码或任何其他形式的文档的枚举.错误意味着什么,我如何确定一般情况?
我知道这const是无法改变的,即使它是 a ,声明 aconst [counter, setCouter] = useState();仍然能够改变 a吗?const counterconst
我遇到了变量阴影和不同块作用域内的变量。但是,const counter即使当您使用 重新分配它时它不在不同的范围内,这里也可以正常工作setCounter。
测验:以下程序打印什么?
using System;
using System.Runtime.InteropServices;
namespace ConsoleApplication2 {
[StructLayout(LayoutKind.Sequential, Pack=1)]
struct Struct1 {
bool b;
int i;
}
[StructLayout(LayoutKind.Sequential, Pack=1)]
struct Struct2 {
byte b;
int i;
}
class Program {
static void Main(string[] args) {
Console.WriteLine(Marshal.SizeOf(typeof(Struct1)));
Console.WriteLine(Marshal.SizeOf(typeof(Struct2)));
Console.ReadKey();
}
}
}
Run Code Online (Sandbox Code Playgroud)
回答:
8
5
Run Code Online (Sandbox Code Playgroud)
这对我来说非常困惑.bool和byte都有1个字节的大小,指定[StructLayout(LayoutKind.Sequential, Pack=1)]应该使任何填充问题无效.两个结构都应该是5个字节.所以我有两个问题:
谢谢.
我仍然试图围绕F#如何概括(或不是)函数和类型,并且有一个案例让我烦恼:
let min(a, b) = if a < b then a else b
let add(a, b) = a + b
let minInt = min(3, 4)
let minFloat = min(3.0, 4.0) // works!
let addInt = add(3, 5)
let addFloat = add(3.0, 5.0) // error: This expression was expected to have type
// int but here has type float
Run Code Online (Sandbox Code Playgroud)
这里min具有泛型类型,'a * 'a -> 'a (requires comparison)而add具有一种具体类型int * int -> int,显然是从它在程序中的第一次使用推断出来的.两者都以相同的方式声明和使用,那为什么泛化的区别呢?
我理解在add的情况下,问题可以通过声明函数内联来进行,因为它会导致它获得泛型类型定义,即'a * 'b -> 'c (requires …
基本上,内存损坏是由覆盖您不应该覆盖的内存引起的.我想知道这是否可能与C#中的不安全代码(即不通过调用外部非托管代码).我看到两种可能的情况:
在这两种情况下,似乎运行时检测并防止潜在的内存损坏发生.因此,是否有可能使用不安全的代码来破坏C#中的内存?作为必然结果,从不安全的代码中捕获AccessViolationExceptions是否安全?
我正在使用BlockingCollection来实现任务调度程序,基本上:
public class DedicatedThreadScheduler : TaskScheduler, IDisposable
{
readonly BlockingCollection<Task> m_taskQueue = new BlockingCollection<Task>();
readonly Thread m_thread;
public DedicatedThreadScheduler()
{
m_thread = new Thread(() =>
{
foreach (var task in m_taskQueue.GetConsumingEnumerable())
{
TryExecuteTask(task);
}
m_taskQueue.Dispose();
});
m_thread.Start();
}
public void Dispose()
{
m_taskQueue.CompleteAdding();
}
protected override bool TryExecuteTaskInline(Task task, bool taskWasPreviouslyQueued)
{
return Thread.CurrentThread == m_thread && TryExecuteTask(task);
}
(...)
}
Run Code Online (Sandbox Code Playgroud)
我只看过一次并且无法重现这一点,但是在foreach的某个时刻(在TryTakeWithNoTimeValidation中)我得到了一个OperationCanceledException.我不明白,因为我正在使用不采用CancellationToken的重载,并且文档声明它可能只抛出ObjectDisposedException.这个例外是什么意思?封锁收集完成了吗?队列中的任务被取消了?
更新:调用堆栈如下所示:
mscorlib.dll!System.Threading.SemaphoreSlim.WaitUntilCountOrTimeout(int millisecondsTimeout, uint startTime, System.Threading.CancellationToken cancellationToken) + 0x36 bytes
mscorlib.dll!System.Threading.SemaphoreSlim.Wait(int millisecondsTimeout, System.Threading.CancellationToken cancellationToken) …Run Code Online (Sandbox Code Playgroud) 我正在学习F#,关于这种语言我最关心的一件事就是表现.我写了一个小基准,我将惯用的F#与用同一种语言编写的命令式代码进行比较 - 令我惊讶的是,功能版本的出现速度明显更快.
基准包括:
这是代码:
open System
open System.IO
open System.Diagnostics
let reverseString(str:string) =
new string(Array.rev(str.ToCharArray()))
let CSharpStyle() =
let lines = File.ReadAllLines("text.txt")
for i in 0 .. lines.Length - 1 do
lines.[i] <- reverseString(lines.[i])
File.WriteAllLines("text.txt", lines)
let FSharpStyle() =
File.ReadAllLines("text.txt")
|> Seq.map reverseString
|> (fun lines -> File.WriteAllLines("text.txt", lines))
let benchmark func message =
// initial call for warm-up
func()
let sw = Stopwatch.StartNew()
for i in 0 .. 19 do
func()
printfn message sw.ElapsedMilliseconds
[<EntryPoint>] …Run Code Online (Sandbox Code Playgroud) 我想在F#中写出这个C#的等价物:
struct Vector2 {
public readonly int X;
public readonly int Y;
public Vector2(int x, int y) {
X = x;
Y = y;
}
}
Run Code Online (Sandbox Code Playgroud)
这会强制用户提供参数来创建实例[编辑:这对于值类型是错误的 - 所有值类型都有默认构造函数].默认的Vector2也可以提供静态只读字段,即Vector2.Zero.
看起来获取公共字段的唯一方法是通过"val"关键字,但似乎不允许我使用默认构造函数初始化它们,我不希望有两个构造函数:
[<Struct>]
type MyInt(value) =
val public Value : int = value;;
val public Value : int = value;;
-------------------------------^
stdin(7,32): error FS0010: Unexpected symbol '=' in member definition
Run Code Online (Sandbox Code Playgroud)
我知道这可以通过成员绑定来完成,但如果我理解的话,这会创建属性,而不是字段.
我最近看到一些生产代码的效果:
if (Process.GetCurrentProcess().HasExited)
{
// do something
}
Run Code Online (Sandbox Code Playgroud)
这有意义吗?直观地说,如果进程已经退出,那么其中就没有代码可以运行.
如果没有,那么判断当前流程是否正在终止的好方法是什么?
如果它具有任何相关性,那么用例就是避免弹出断言,例如在进程被杀死时没有丢弃的对象.