У меня проблема с фрагментом данных в виде строки, и мне нужно проверить, существуют ли данные в указанных диапазонах.
Обратите внимание: если оба конца являются числами, сравнение не является обычным сравнением чисел. См. примеры ниже:
Надеюсь, это помогло. Я изо всех сил пытаюсь выяснить, является ли этот вид сравнения известным типом и существуют ли решения, которые я могу использовать.
Если я не очень хорошо объясняю это должным образом, не стесняйтесь, дайте мне знать. Я рад предоставить больше примеров
Редактировать На случай, если у кого-то возникнет подобная проблема, я нашел RangeTree для хранения значений high-low и сравнения входящих данных.
Почему в первом примере нет 9959 или 99580?
отредактировал вопрос, так как «99580» находится в первом диапазоне. «9959» или, казалось бы, промежуточное число, например 86344, находится вне диапазона.
@MaythamFahmi, я могу определить диапазон, но надеялся избежать изобретения велосипеда. Владелец бизнеса уверен, что это какое-то стандартное сравнение строк.
ок, правильно ли это во втором примере High-"3101"
стандартная сортировка строк, похоже, будет работать. Попытался ли ты?
@topsail, если можно, расскажи подробнее.
Ваш вопрос в его нынешнем виде содержит несколько примеров и просит нас вывести из него шаблон И предоставить алгоритм для этого шаблона. Но именно вы должны определить, какой шаблон вам нужен, иначе с нашей стороны это будут лишь догадки, а вы отвергнете все наши неверные догадки. Поэтому, пожалуйста, опишите шаблон, который вы собираетесь реализовать, простыми словами. Это поможет нам, а главное, вам понять, в чем состоит задача. И как только мы с вами поймем, в чем заключается задача, скорее всего, это будет решаемый вопрос.
Является ли «Низкий-»30789», Высокий-«310100» -> Значения в диапазоне = «30789», «30790» до «31000»» опечаткой? Почему самое высокое значение будет 31000, а не 310100?
Это основная программа для консольного приложения .NET, которая использует сравнение строк .NET по умолчанию для ваших тестовых данных:
internal class Program
{
static void Main(string[] args)
{
var lo = "9958";
var hi = "99585";
var strings = new List<string>{ "9958", "99581", "99585" };
CheckIt(lo, hi, strings);
lo = "30789";
hi = "310100";
strings = new List<string>{ "30789", "30790", "31000" };
CheckIt(lo, hi, strings);
lo = "81190";
hi = "81190ZZ";
strings = new List<string>{ "81190", "81190A", "81190AA", "81190B", "81190C", "81190AB", "81190ZZ" };
CheckIt(lo, hi, strings);
}
static void CheckIt(string lo, string hi, List<string> strings)
{
foreach(var s in strings)
{
Console.WriteLine($"{s} >= {lo} <= {hi}: {s.CompareTo(lo) >= 0 && s.CompareTo(hi) <= 0}");
}
}
}
Все выходы True
. Конечно, вы могли бы написать более качественный тестовый код и, возможно, использовать подход модульного тестирования, но это простой пример для начала.
Примечание: хотя это может показаться тривиальной темой, я надеюсь, что сортировка строк — это то, над чем все разработчики размышляли и исследовали в течение нескольких часов на каком-то этапе своего обучения. Например, вы должны знать, почему «1» может сортироваться раньше «10» при сортировке как строка или стоит ли «а» перед «А». Как только вы поймете это достаточно хорошо, многие другие вещи обретут смысл (и на ум приходят другие хорошие вопросы, например, предшествует ли буква с акцентом в испанском языке букве без акцента...?)
это действительно оно. спасибо, что нашли время объяснить. Сравнение строки по диапазону в SQL Server — еще одно похожее (не точное) объяснение этой проблемы.
А как насчет 995812 или 9958XY для первого диапазона, 30789A или 30B для второго, 8119012 для последнего? Я предполагаю, что должна быть проверка не короче, чем более короткая граница, не длиннее, чем более длинная, и для разных длин «класс символов» каждой позиции за пределами длины более короткой границы соответствует классу в более длинной.
Высказывали ли вы какие-либо мысли о возможном решении