Итерация по диапазонам Юникода - PullRequest
0 голосов
/ 25 июня 2018

Я хочу получить диапазон символов между любыми двумя точками Unicode.

Это ниже не работает в VB.NET и не дает никаких подсказок о том, как преобразовать его для использования Unicode.

for (char c = 'A'; c <= 'Z'; c++)
{
    yield return c;
} 

Выше отсюда

Преобразовано это выглядит так:

For c As Char = "A"c To "Z"c
    Yield c
Next

Но это приводит к ошибке " 'For' переменная управления циклом не может иметь тип 'Char', поскольку тип не поддерживает требуемые операторы. "

Скажем, я хочу получить Basic Latin, есть ли способ сделать это, как показано ниже?

For c As Char = U+0000 To U+007F
    Yield c
Next

Я изо всех сил пытаюсь найти что-нибудь на эту конкретную тему.

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Другой способ сделать это - использовать Enumerable.Range. Вот одна строка:

Enumerable.Range(AscW("A"c), AscW("Z"c) - AscW("A"c) + 1).Select(Function(i) ChrW(i))

Вы можете поместить его в функцию, подобную этой:

Public Function CharRange(first As Char, last As Char) As IEnumerable(Of Char)
    Return Enumerable.Range(AscW(first), AscW(last) - AscW(first) + 1).Select(Function(i) ChrW(i))
End Function

Для версии Unicode вам нужно использовать целые числа вместо символов:

Public Function CharRange(first As Integer, last As Integer) As IEnumerable(Of Char)
    Return Enumerable.Range(first, last - first + 1).Select(Function(i) ChrW(i))
End Function

Кроме того, теперь, когда у нас есть Целочисленная версия , вы можете заменить первую функцию этой более короткой версией:

Public Function CharRange(first As Char, last As Char) As IEnumerable(Of Char)
    Return CharRange(AscW(first), AscW(last))
End Function

Пример использования:

'Dim combined As String = String.Join("", CharRange("A"c, "Z"c))
Dim combined As String = String.Join("", CharRange(&H41, &H5A))
Console.WriteLine(combined)

Выход:

АБВГДЕЖЗИКЛМНОПРСТУФХЧШЭЮЯ

0 голосов
/ 25 июня 2018

К сожалению, VB.NET не обрабатывает символы так же, как C #.Символ на самом деле представляет собой просто число (известное как символьный код ), которое представляет букву, поэтому для компьютера действительно имеет смысл использовать их в цикле.

Однако, чтобы он работал в VB.NET, вам нужно сначала преобразовать символы в целые числа, чтобы иметь возможность использовать их в цикле, а затем преобразовать целое число в каждой итерации обратно в Char:

For i As Integer = AscW("A"c) To AscW("Z"c)
    Dim c As Char = ChrW(i)
    Yield c
Next

Что касается вашего второго примера, кодовые точки Unicode представлены в виде U+####.Часть #### представляет собой шестнадцатеричное число, которое можно записать в VB.NET в виде &H####.Для компилятора шестнадцатеричное число - это просто нормальное число, поэтому все, что вам нужно сделать, это изменить свой цикл на:

For i As Integer = &H0000 To &H007F
    Dim c As Char = ChrW(i)
    Yield c
Next
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...