C# 切换语句为只读span<;char>;不支持吗?
我在玩C#中的Span 我不能将switch语句与span一起使用,我必须编写这样的方法,对吗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
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
,这是一种学术练习。