Расширяясь по нескольким предыдущим ответам и используя методы расширения, я пришел к следующему: у него нет оговорок потенциального множественного перечисляемого перечисления или проблем производительности, связанных с использованием нескольких объектов регулярных выражений, или вызова регулярного выражения (/ g0)
Селектор поддерживает типичную типизацию, позволяющую назначать любого делегата, элементы в исходной коллекции мутируются. Это означает, что он использует ToList (), что может отрицать преимущества в больших коллекциях.
селектором, затем преобразуется в строки с помощью ToString ().
private static readonly Regex _NaturalOrderExpr = new Regex(@"\d+", RegexOptions.Compiled);
public static IEnumerable<TSource> OrderByNatural<TSource, TKey>(
this IEnumerable<TSource> source, Func<TSource, TKey> selector)
{
int max = 0;
var selection = source.Select(
o =>
{
var v = selector(o);
var s = v != null ? v.ToString() : String.Empty;
if (!String.IsNullOrWhiteSpace(s))
{
var mc = _NaturalOrderExpr.Matches(s);
if (mc.Count > 0)
{
max = Math.Max(max, mc.Cast<Match>().Max(m => m.Value.Length));
}
}
return new
{
Key = o,
Value = s
};
}).ToList();
return
selection.OrderBy(
o =>
String.IsNullOrWhiteSpace(o.Value) ? o.Value : _NaturalOrderExpr.Replace(o.Value, m => m.Value.PadLeft(max, '0')))
.Select(o => o.Key);
}
public static IEnumerable<TSource> OrderByDescendingNatural<TSource, TKey>(
this IEnumerable<TSource> source, Func<TSource, TKey> selector)
{
int max = 0;
var selection = source.Select(
o =>
{
var v = selector(o);
var s = v != null ? v.ToString() : String.Empty;
if (!String.IsNullOrWhiteSpace(s))
{
var mc = _NaturalOrderExpr.Matches(s);
if (mc.Count > 0)
{
max = Math.Max(max, mc.Cast<Match>().Max(m => m.Value.Length));
}
}
return new
{
Key = o,
Value = s
};
}).ToList();
return
selection.OrderByDescending(
o =>
String.IsNullOrWhiteSpace(o.Value) ? o.Value : _NaturalOrderExpr.Replace(o.Value, m => m.Value.PadLeft(max, '0')))
.Select(o => o.Key);
}
Кажется, что Java не может обрабатывать слишком большое число, например, int или long, поэтому обрабатываете как string и используете свойство length для обработки и разбора на int или long.
Примечание: если длина строки слишком велика, чем может поддерживать целое или длинное, используйте функцию возврата или любую функцию обратного вызова.
Диапазон переменных Java: -
Здесь описано, как генерировать пользовательские ошибки. Я бы предложил принять String
как value
для идентификатора пользователя. Когда синтаксический анализ value
не удался, вы можете выдать свою пользовательскую ошибку.
Long
на String
Затем преобразуйте это строковое значение в long, как показано ниже:
Long idValue = Long.valueOf(Id);
добавьте существующий код здесь