Tôi viết trình thông báo toán học đơn giản và cố gắng sử dụng tính năng C# pattern matching
mới.Trường hợp khớp mẫu khi
Tokenizer là khá đơn giản:
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);
}
}
Tôi đang sử dụng case var _
vì tôi muốn để phù hợp với điều kiện bằng mà không sử dụng if-else if
chuỗi, nhưng tôi không thể viết case when
mà không chỉ định var variableName
.
Có cách nào ưa thích để thực hiện thao tác như vậy không? Hoặc nó được khuyến khích cách để làm những việc này?
Vâng, bạn đang loại lạm dụng mô hình phù hợp để có được xung quanh các yêu cầu của việc sử dụng hằng số trong báo cáo chuyển đổi vì vậy không có cách nào thực sự để có được xung quanh nó. Ngoài ra, tôi nghĩ rằng logic của bạn có thể phù hợp/đọc tốt hơn như nếu/else báo cáo anyway. – DavidG
@DavidG ngược lại, trông giống như các mẫu hoạt động, làm cho việc triển khai mã thông báo và trình phân tích cú pháp dễ dàng hơn nhiều. Khớp mẫu trong C# 7 bỏ sót một số tính năng quan trọng. Các mẫu hoạt động là một trong số chúng. Tôi muốn ưu tiên cao hơn cho phù hợp hoàn toàn mặc dù –
@PanagiotisKanavos Có, nhưng tôi đang nói về những gì có sẵn ngay bây giờ trong ngôn ngữ. Tôi khá chắc chắn chúng ta sẽ thấy nhiều thứ phù hợp với mẫu sắp tới trong C# trong tương lai (nhờ chủ yếu là F # tôi sẽ giả định) – DavidG