C# 切换语句为只读span<;char>;不支持吗?

C# 切换语句为只读span<;char>;不支持吗?,c#,C#,我在玩C#中的Span 我不能将switch语句与span一起使用,我必须编写这样的方法,对吗 private int GetNumberOfLegs(ReadOnlySpan<char> animal) { if (animal.SequenceEqual("dog".AsSpan())) return 4; if (animal.SequenceEqual("cat".AsSpan())) return 4; if

我在玩C#中的Span

我不能将switch语句与span一起使用,我必须编写这样的方法,对吗

 private int GetNumberOfLegs(ReadOnlySpan<char> animal)
 {
     if (animal.SequenceEqual("dog".AsSpan()))
        return 4;
     if (animal.SequenceEqual("cat".AsSpan()))
        return 4;
     if (animal.SequenceEqual("spider".AsSpan()))
        return 8;
     if (animal.SequenceEqual("bird".AsSpan()))
        return 2;

    throw new NotSupportedException($"Uknown animal {animal.ToString()}");
 }
private int GetNumberOfLegs(ReadOnlySpan animal)
{
if(animal.SequenceEqual(“dog.AsSpan()))
返回4;
if(animal.SequenceEqual(“cat.AsSpan()))
返回4;
if(animal.SequenceEqual(“spider.AsSpan()))
返回8;
if(animal.SequenceEqual(“bird.AsSpan()))
返回2;
抛出新的NotSupportedException($“Uknown animal{animal.ToString()}”);
}
有没有更好的方法用Span来表达这个算法?

滥用可能会有帮助:

private int GetNumberOfLegs(ReadOnlySpan<char> animal)
{
    switch (animal)
    {
        case var dog when dog.SequenceEqual("dog".AsSpan()):
            return 4;
        case var cat when cat.SequenceEqual("cat".AsSpan()):
            return 4;
        case var spider when spider.SequenceEqual("spider".AsSpan()):
            return 8;
        case var bird when bird.SequenceEqual("bird".AsSpan()):
            return 2;
    }

    throw new NotSupportedException($"Uknown animal {animal.ToString()}");
}
private int GetNumberOfLegs(ReadOnlySpan animal)
{
开关(动物)
{
当dog.SequenceEqual(“dog.AsSpan())时,案例变量dog为:
返回4;
当cat.SequenceEqual(“cat.AsSpan())时的case var cat:
返回4;
当spider.SequenceEqual(“spider.AsSpan())时的案例变量spider:
返回8;
案例变量bird when bird.SequenceEqual(“bird.AsSpan()):
返回2;
}
抛出新的NotSupportedException($“Uknown animal{animal.ToString()}”);
}

您是否尝试使用
开关
语句?发生了什么?应该是常量值。能否将
ReadOnlySpan
转换为
string
,然后利用switch语句?我不想将ReadOnlySpan转换为string,因为这将是堆上的分配,我需要在没有任何堆分配的情况下编写超快的realitme代码-没有垃圾收集。C#中的正常切换字符串通过为每个case块指定一个条目来实现。因此,要对Span执行相同的操作,您需要只迭代字符的Span一次,以生成哈希代码,然后打开它,并且仅在哈希代码冲突时执行字符串比较。这有
O(n*m)
运行时(其中
n
是字符串的长度,
m
是案例数)-这与一堆
if/else if
语句是一样的。我认为
switch
应该保留在接近
O(1)
的情况下。@Dai我同意,但在这里我想不出更好的方法来使用
switch
,这是一种学术练习。