小编Asi*_*sik的帖子

是否可以实现递归"SelectMany"?

众所周知,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语言欢迎中的示例.

.net c# recursion f#

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

如何找出这个ffmpeg错误代码的含义?

我正在使用avcodec_decode_video2函数.在流中的编码更改时,它返回-1094995529.文档仅说明:

出错时,返回负值,否则使用的字节数,如果没有帧可以解压缩,则返回零.

但似乎没有返回代码或任何其他形式的文档的枚举.错误意味着什么,我如何确定一般情况?

c c++ ffmpeg

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

即使 useState 是常量,它如何改变?

我知道这const是无法改变的,即使它是 a ,声明 aconst [counter, setCouter] = useState();仍然能够改变 a吗?const counterconst

我遇到了变量阴影和不同块作用域内的变量。但是,const counter即使当您使用 重新分配它时它不在不同的范围内,这里也可以正常工作setCounter

theory variables constants reactjs

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

StructLayout Pack = 1不适用于bool?

测验:以下程序打印什么?

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个字节.所以我有两个问题:

  • 为什么编组以这种方式工作?
  • 任何解决方法?我需要导入本机结构中的1字节布尔值.我可以使用字节而不是当然,但它是"凌乱".

谢谢.

c# native marshalling

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

F#中的通用函数

我仍然试图围绕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 …

generics f# automatic-generalization

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

C#中的不安全代码会导致内存损坏吗?

基本上,内存损坏是由覆盖您不应该覆盖的内存引起的.我想知道这是否可能与C#中的不安全代码(即不通过调用外部非托管代码).我看到两种可能的情况:

  • 访问空指针 - >由CLR捕获,抛出NullReferenceException
  • 访问指向无效随机存储器位置的指针 - >由CLR捕获,抛出AccessViolationException

在这两种情况下,似乎运行时检测并防止潜在的内存损坏发生.因此,是否有可能使用不安全的代码来破坏C#中的内存?作为必然结果,从不安全的代码中捕获AccessViolationExceptions是否安全?

.net c#

9
推荐指数
3
解决办法
2514
查看次数

BlockingCollection(T).GetConsumingEnumerable()如何抛出OperationCanceledException?

我正在使用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)

c# task-parallel-library

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

Seq.map比常规for循环更快?

我正在学习F#,关于这种语言我最关心的一件事就是表现.我写了一个小基准,我将惯用的F#与用同一种语言编写的命令式代码进行比较 - 令我惊讶的是,功能版本的出现速度明显更快.

基准包括:

  1. 使用File.ReadAllLines读取文本文件
  2. 颠倒每行内的字符顺序
  3. 使用File.WriteAllLines将结果写回同一文件.

这是代码:

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)

performance f#

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

如何使用公共字段声明不可变结构?

我想在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)

我知道这可以通过成员绑定来完成,但如果我理解的话,这会创建属性,而不是字段.

f#

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

Process.HasExit对于当前进程是否可以为真?

我最近看到一些生产代码的效果:

if (Process.GetCurrentProcess().HasExited)
{
    // do something
}
Run Code Online (Sandbox Code Playgroud)

这有意义吗?直观地说,如果进程已经退出,那么其中就没有代码可以运行.

如果没有,那么判断当前流程是否正在终止的好方法是什么?

如果它具有任何相关性,那么用例就是避免弹出断言,例如在进程被杀死时没有丢弃的对象.

.net c#

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