Piszę prosty tokenizer matematyczny i próbuję użyć nowej funkcji C# pattern matching
.Przypadek pasujący do wzoru, gdy
Tokenizer jest dość prosta:
public IEnumerable<IToken> Tokenize(string input)
{
const char decimalSeparator = '.';
string inputWithoutSpaces = input.Replace(" ", string.Empty);
var numberBuffer = new StringBuilder();
var letterBuffer = new StringBuilder();
foreach (char c in inputWithoutSpaces)
{
switch (c)
{
case var _ when IsTerm(c, letterBuffer):
if (numberBuffer.Length > 0)
{
yield return EmptyNumberBufferAsLiteral(numberBuffer);
yield return new Operator('*');
}
letterBuffer.Append(c);
break;
case decimalSeparator:
case var _ when IsDigit(c):
numberBuffer.Append(c);
break;
case var _ when IsOperator(c):
if (numberBuffer.Length > 0)
{
yield return EmptyNumberBufferAsLiteral(numberBuffer);
}
if (letterBuffer.Length > 0)
{
yield return EmptyLetterBufferAsTerm(letterBuffer);
}
yield return new Operator(c);
break;
}
}
if (numberBuffer.Length > 0)
{
yield return EmptyNumberBufferAsLiteral(numberBuffer);
}
if (letterBuffer.Length > 0)
{
yield return EmptyLetterBufferAsTerm(letterBuffer);
}
}
Używam case var _
ponieważ chcę, aby dopasować według stanu bez użycia if-else if
łańcuch, ale jestem w stanie napisać case when
bez określania var variableName
.
Czy istnieje jakiś sposób na wykonanie takiej operacji? Czy jest to zalecany sposób na robienie tych rzeczy?
Cóż, nadużywasz porównywania wzorców, aby ominąć wymóg używania stałych w instrukcjach przełączania, więc nie ma sposobu na obejście tego. Dodatkowo, myślę, że twoja logika prawdopodobnie pasuje/czyta lepiej, tak czy inaczej, tak czy inaczej. – DavidG
@DavidG wręcz przeciwnie, wygląda to na Active Patterns, co znacznie ułatwia implementację tokenizerów i parserów. Dopasowanie do wzorca w C# 7 pomija kilka ważnych cech. Aktywne wzorce są jednym z nich. Zyskałbym wyższy priorytet, jeśli chodzi o wyczerpujące dopasowywanie, ale –
@PanagiotisKanavos Tak, ale mówię o tym, co jest teraz dostępne w tym języku. Jestem prawie pewien, że zobaczymy dużo więcej elementów dopasowujących do wzorca, które pojawią się w C# w przyszłości (głównie dzięki F #, które zakładam). – DavidG