Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
 Аватар для Strannik_san
7 / 7 / 0
Регистрация: 07.09.2019
Сообщений: 207

Сортировка массива

08.01.2025, 23:43. Показов 1420. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени уважаемые форумчане.Подскажите как отсортировать одномерный массив в нормальном порядке.При обычном добавлении в массив сортируется так как на изображении.Отсортировать через
VB.NET Скопировано
1
Array.Sort(Files)
не меняет ситуации.
Миниатюры
Сортировка массива  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.01.2025, 23:43
Ответы с готовыми решениями:

Сортировка массива
Имеется массив из процессов. Dim S() As Process = Process.GetProcesses Требуется рассортировать их по алфавиту.

Сортировка массива
Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ...

Сортировка массива
Инициализирую одномерный массив случайными целыми числами, затем пишу процедуру сортировки... и ничего не получается, вывожу в консоль...

20
Администратор
Эксперт .NET
 Аватар для OwenGlendower
17898 / 13994 / 5345
Регистрация: 17.03.2014
Сообщений: 28,652
Записей в блоге: 1
09.01.2025, 11:59
Лучший ответ Сообщение было отмечено Yury Komar как решение

Решение

Strannik_san, с точки зрения строк это и есть нормальный порядок Чтобы получить нужный вам порядок, нужно (на выбор):
  • если у вас новый .NET, то использовать NuGet пакет NaturalSort.Extension (пример)
  • сделать свой сортировщик специально под имена файлов которые заканчиваются цифрой (пример)
  • сделать универсальный сортировщик на основе функции Windows API StrCmpLogicalW (пример)
1
 Аватар для Andrey-MSK
3160 / 2057 / 375
Регистрация: 14.08.2018
Сообщений: 6,756
Записей в блоге: 4
09.01.2025, 16:26
Цитата Сообщение от Strannik_san Посмотреть сообщение
Подскажите как отсортировать одномерный массив в нормальном порядке.
Вот сортировщик для строк с числами. На VB.NET переведите сами
C# Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
using System.Collections.Generic;
 
namespace DBClient.Services.Sorters
{
    public class NaturalStringComparer : IComparer<string>
    {
        public static NaturalStringComparer Instance { get; } = new NaturalStringComparer();
 
        public int Compare(string x, string y)
        {
            string s1 = x;
            if (s1 == null)
            {
                return 0;
            }
            string s2 = y;
            if (s2 == null)
            {
                return 0;
            }
 
            int len1 = s1.Length;
            int len2 = s2.Length;
            int marker1 = 0;
            int marker2 = 0;
 
            // Walk through two the strings with two markers.
            while (marker1 < len1 && marker2 < len2)
            {
                char ch1 = s1[marker1];
                char ch2 = s2[marker2];
 
                // Some buffers we can build up characters in for each chunk.
                char[] space1 = new char[len1];
                int loc1 = 0;
                char[] space2 = new char[len2];
                int loc2 = 0;
 
                // Walk through all following characters that are digits or
                // characters in BOTH strings starting at the appropriate marker.
                // Collect char arrays.
                do
                {
                    space1[loc1++] = ch1;
                    marker1++;
 
                    if (marker1 < len1)
                    {
                        ch1 = s1[marker1];
                    }
                    else
                    {
                        break;
                    }
                } while (char.IsDigit(ch1) == char.IsDigit(space1[0]));
 
                do
                {
                    space2[loc2++] = ch2;
                    marker2++;
 
                    if (marker2 < len2)
                    {
                        ch2 = s2[marker2];
                    }
                    else
                    {
                        break;
                    }
                } while (char.IsDigit(ch2) == char.IsDigit(space2[0]));
 
                // If we have collected numbers, compare them numerically.
                // Otherwise, if we have strings, compare them alphabetically.
                string str1 = new string(space1);
                string str2 = new string(space2);
 
                int result;
 
                if (char.IsDigit(space1[0]) && char.IsDigit(space2[0]))
                {
                    long thisNumericChunk = long.Parse(str1);
                    long thatNumericChunk = long.Parse(str2);
                    result = thisNumericChunk.CompareTo(thatNumericChunk);
                }
                else
                {
                    result = str1.CompareTo(str2);
                }
 
                if (result != 0)
                {
                    return result;
                }
            }
            return len1 - len2;
        }
    }
}
Использование в сложном сортировщике свои объектов
C# Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
using System;
using System.Collections;
 
using DTOClassLibrary.DTO;
 
namespace DBClient.Services.Sorters
{
    public class GPReportSorter : IComparer
    {
        // Наш сортировщик
        private readonly NaturalStringComparer _stringComparer = NaturalStringComparer.Instance;
 
        public int Compare(object x, object y)
        {
            if (x is not GPReport && y is not GPReport)
                throw new ArgumentException("Этот тип объектов не поддерживается!");
 
            GPReport _x = x as GPReport;
            GPReport _y = y as GPReport;
 
            int result = _stringComparer.Compare(_x.KKS, _y.KKS);
 
            if (result == 0)
                result = _stringComparer.Compare(_x.Abbreviation, _y.Abbreviation);
 
            return result;
        }
    }
}
Добавлено через 8 минут
Strannik_san, Использование в LINQ
C# Скопировано
1
2
3
draws = draws
    .OrderBy(d => d.DNumber, NaturalStringComparer.Instance)
    .ToList();
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
17898 / 13994 / 5345
Регистрация: 17.03.2014
Сообщений: 28,652
Записей в блоге: 1
09.01.2025, 17:11
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
C# Скопировано
15
            if (x is not GPReport && y is not GPReport)
В условии вместо && нужно || по идее использовать.
0
 Аватар для Andrey-MSK
3160 / 2057 / 375
Регистрация: 14.08.2018
Сообщений: 6,756
Записей в блоге: 4
09.01.2025, 17:13
Цитата Сообщение от OwenGlendower Посмотреть сообщение
В условии вместо && нужно || по идее использовать.
Зачем ИЛИ? Мы ведь сравниваем два объекта одного типа, потому И.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
17898 / 13994 / 5345
Регистрация: 17.03.2014
Сообщений: 28,652
Записей в блоге: 1
09.01.2025, 21:19
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Зачем ИЛИ?
Затем что начальное условие было Если x Является GPReport И y Является GPReport. Мы его инвертировали чтобы выбросить ArgumentException. Значит по правилам булевской логики условие превращается в Если x НеЯвляется GPReport ИЛИ y НеЯвляется GPReport. Правильность этого утверждения мы можем проверить на практике. Что будет если в метод Compare передадут GPReport и string. Мы ожидаем ArgumentException, но получим NullReferenceException.

Более интересный вопрос зачем мы тут используем IComparer, а не IComparer<GPReport>? В таком случае вопросы про неверные типы просто бы отпали.
0
 Аватар для Strannik_san
7 / 7 / 0
Регистрация: 07.09.2019
Сообщений: 207
09.01.2025, 21:48  [ТС]
OwenGlendower, спасибо за ответ.А не подскажете как сделать свой сортировщик на основе моего изображения со второго примера что вы указали тему.Не совсем понимаю как правильно это реализовать.Так как количество файлов будет 5300 штук.

Добавлено через 2 минуты
Andrey-MSK, спасибо за ответ,но писать столько кода для сортировки массива в программе у которой код меньше чем сама сортировка это слишком.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
17898 / 13994 / 5345
Регистрация: 17.03.2014
Сообщений: 28,652
Записей в блоге: 1
09.01.2025, 21:52
Лучший ответ Сообщение было отмечено Strannik_san как решение

Решение

Цитата Сообщение от Strannik_san Посмотреть сообщение
как сделать свой сортировщик
У вас Windows же? Тогда возьмите код класса Comparer отсюда. Тогда сортировку можно будет сделать так:
VB.NET Скопировано
1
Array.Sort(Files, New Comparer())
3
 Аватар для Strannik_san
7 / 7 / 0
Регистрация: 07.09.2019
Сообщений: 207
09.01.2025, 22:09  [ТС]
OwenGlendower, Спасибо огромное.
0
 Аватар для Andrey-MSK
3160 / 2057 / 375
Регистрация: 14.08.2018
Сообщений: 6,756
Записей в блоге: 4
10.01.2025, 08:30
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Более интересный вопрос зачем мы тут используем IComparer, а не IComparer<GPReport>
Потому что используется это там, где нужно просто IComparer, и конечная точка не принимает типизированный сортировщик. Вот где это применяется, тут не GPReport, но суть таже
C# Скопировано
1
2
3
4
5
6
7
8
_sourceDrawReport = (CollectionViewSource)Resources["DrawReportsSort"];
_sourceGPlans = (CollectionViewSource)Resources["GPlansSort"];
 
_viewDrawReport = (ListCollectionView)_sourceDrawReport.View;
_viewGPlans = (ListCollectionView)_sourceGPlans.View;
 
_viewDrawReport.CustomSort = DrawReportSorter.Instance;
_viewGPlans.CustomSort = GPlanSorter.Instance;
И где можно применять типизованный сортировщик, то я его и применяю
C# Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
using System.Collections.Generic;
 
using DTOClassLibrary.DTO;
 
namespace VModels.Services.Sorters
{
    public class MRNZPositionSorter : IComparer<MRNZPosition>
    {
        private readonly NaturalStringComparer _stringComparer = NaturalStringComparer.Instance;
 
        public static MRNZPositionSorter Instance { get; } = new MRNZPositionSorter();
 
        public int Compare(MRNZPosition x, MRNZPosition y)
        {
            int result = _stringComparer.Compare(x.DNumber, y.DNumber);
 
            if (result == 0)
                result = _stringComparer.Compare(x.DSheet, y.DSheet);
 
            if (result == 0)
                result = _stringComparer.Compare(x.WorkName, y.WorkName);
 
            return result;
        }
    }
}
Цитата Сообщение от Strannik_san Посмотреть сообщение
но писать столько кода для сортировки массива в программе у которой код меньше чем сама сортировка это слишком
А что тут такого? Зато имеем нормальную сортировку любого массива строк с числами для любой ОС. Но решать вам...
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
17898 / 13994 / 5345
Регистрация: 17.03.2014
Сообщений: 28,652
Записей в блоге: 1
10.01.2025, 10:43
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Потому что используется это там, где нужно просто IComparer, и конечная точка не принимает типизированный сортировщик. Вот где это применяется, тут не GPReport, но суть таже
Окей, но у ТС же нет таких ограничений.

Цитата Сообщение от Andrey-MSK Посмотреть сообщение
имеем нормальную сортировку любого массива строк с числами для любой ОС.
Если бы он еще память более бережно использовал. Набросал простой бенчмарк чтобы сравнить его с пакетом NaturalSort.Extension. Получил такой результат:
Code Скопировано
1
2
3
4
| Method | Mean     | Error   | StdDev  | Gen0   | Allocated |
|------- |---------:|--------:|--------:|-------:|----------:|
| NSC    | 632.6 ns | 2.86 ns | 2.67 ns | 0.2012 |    2112 B |
| Ext    | 236.9 ns | 1.16 ns | 1.09 ns | 0.0243 |     256 B |
Кликните здесь для просмотра всего текста
C# Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[MemoryDiagnoser]
public class Thread3191140Benchmark
{
    private readonly string s1 = "abc-2024-12-31_19.jpg";
    private readonly string s2 = "abc-2024-12-31_2.jpg";
 
    private static readonly IComparer<string> NaturalSortStringComparer = StringComparer.CurrentCulture.WithNaturalSort();
 
    [Benchmark]
    public int NSC()
    {
        return NaturalStringComparer.Instance.Compare(s1, s2);
    }
 
    [Benchmark]
    public int Ext()
    {
        return NaturalSortStringComparer.Compare(s1, s2);
    }
}
1
Администратор
Эксперт .NET
 Аватар для OwenGlendower
17898 / 13994 / 5345
Регистрация: 17.03.2014
Сообщений: 28,652
Записей в блоге: 1
10.01.2025, 18:59
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Если бы он еще память более бережно использовал.
Удалось переписать код так чтобы он не делал выделений памяти. Код написан под .NET Framework. В .NET вместо ToLong следует применить long.Parse принимающий ReadOnlySpan<char>. Код проверил поверхностно. Надеюсь там нет багов
Code Скопировано
1
2
3
4
5
| Method | Mean     | Error   | StdDev  | Ratio | Gen0   | Allocated | Alloc Ratio |
|------- |---------:|--------:|--------:|------:|-------:|----------:|------------:|
| NSC    | 650.7 ns | 5.50 ns | 5.14 ns |  1.00 | 0.2012 |    2112 B |        1.00 |
| NSC2   | 140.0 ns | 0.61 ns | 0.57 ns |  0.22 |      - |         - |        0.00 |
| Ext    | 243.8 ns | 1.29 ns | 1.21 ns |  0.37 | 0.0243 |     256 B |        0.12 |
NaturalStringComparer2
C# Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
public sealed class NaturalStringComparer2 : IComparer<string>
{
    public static NaturalStringComparer2 Instance { get; } = new NaturalStringComparer2();
 
    private NaturalStringComparer2()
    {
    }
 
    public int Compare(string? x, string? y)
    {
        if (x == null || y == null)
        {
            return 0;
        }
 
        int len1 = x.Length;
        int len2 = y.Length;
        int marker1 = 0;
        int marker2 = 0;
 
        // Walk through two the strings with two markers.
        while (marker1 < len1 && marker2 < len2)
        {
            bool isDigit1 = char.IsDigit(x[marker1]);
            bool isDigit2 = char.IsDigit(y[marker2]);
 
            int loc1 = 0;
            int loc2 = 0;
 
            // Find next block of numbers or non-numbers inside each string
            do
            {
                loc1++;
                marker1++;
            } while (marker1 < len1 && char.IsDigit(x[marker1]) == isDigit1);
 
            do
            {
                loc2++;
                marker2++;
            } while (marker2 < len2 && char.IsDigit(y[marker2]) == isDigit2);
 
            int result;
 
            if (isDigit1 && isDigit2)
            {
                long thisNumericChunk = ToLong(x, marker1 - loc1, loc1);
                long thatNumericChunk = ToLong(y, marker2 - loc2, loc2);
                result = thisNumericChunk.CompareTo(thatNumericChunk);
            }
            else
            {
                result = string.Compare(x, marker1 - loc1, y, marker2 - loc2, Math.Min(loc1, loc2));
            }
 
            if (result != 0)
            {
                return result;
            }
        }
        return len1 - len2;
    }
 
    private static long ToLong(string s, int index, int len)
    {
        long result = 0;
        long pow10 = 1;
        while (len-- > 0)
        {
            result += pow10 * (s[index + len] - '0');
            pow10 *= 10;
        }
        return result;
    }
}

Бенчмарк
C# Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[MemoryDiagnoser]
public class Thread3191140Benchmark
{
    private readonly string s1 = "abc-2024-12-31_19.jpg";
    private readonly string s2 = "abc-2024-12-31_2.jpg";
 
    private static readonly IComparer<string> NaturalSortStringComparer = StringComparer.CurrentCulture.WithNaturalSort();
 
    [Benchmark(Baseline = true)]
    public int NSC()
    {
        return NaturalStringComparer.Instance.Compare(s1, s2);
    }
 
    [Benchmark]
    public int NSC2()
    {
        return NaturalStringComparer2.Instance.Compare(s1, s2);
    }
 
    [Benchmark]
    public int Ext()
    {
        return NaturalSortStringComparer.Compare(s1, s2);
    }
}
2
Администратор
Эксперт .NET
 Аватар для OwenGlendower
17898 / 13994 / 5345
Регистрация: 17.03.2014
Сообщений: 28,652
Записей в блоге: 1
13.01.2025, 19:11
Strannik_san, я перевел свой код созданный на основе кода Andrey-MSK на Visual Basic .NET и выложил его в тему с примерами. Возможно вам будет интересно.

Также я сделал бенчмарк (в аттачменте) для сравнения старого и новых вариантов сортировщика. Мой вариант обозначен как NSC2.
Code Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| Method | Runtime            | Mean     | Error     | StdDev    | Gen0     | Allocated |
|------- |------------------- |---------:|----------:|----------:|---------:|----------:|
| NSC    | .NET 8.0           | 2.081 ms | 0.0177 ms | 0.0138 ms | 492.1875 | 5186172 B |
| NSC2   | .NET 8.0           | 1.080 ms | 0.0078 ms | 0.0069 ms |        - |      65 B |
| NSC    | .NET Framework 4.8 | 5.406 ms | 0.0308 ms | 0.0273 ms | 820.3125 | 5191165 B |
| NSC2   | .NET Framework 4.8 | 3.452 ms | 0.0173 ms | 0.0153 ms |        - |         - |
 
// * Legends *
  Mean      : Arithmetic mean of all measurements
  Error     : Half of 99.9% confidence interval
  StdDev    : Standard deviation of all measurements
  Gen0      : GC Generation 0 collects per 1000 operations
  Allocated : Allocated memory per single operation (managed only, inclusive, 1KB = 1024B)
  1 ms      : 1 Millisecond (0.001 sec)
Здесь мы видим результаты для сценария сортировки 530 строк. Старый вариант генерирует большое количество мусора, требуя сотни сборок мусора. Оптимизированный по памяти вариант не триггерит ни одной сборки мусора. Рекомендую всем, а особенно пользователю edmonsur, изучить код чтобы увидеть простые практические способы оптимизации кода по памяти.
Вложения
Тип файла: zip VbNaturalStringComparer.zip (4.5 Кб, 4 просмотров)
2
 Аватар для Andrey-MSK
3160 / 2057 / 375
Регистрация: 14.08.2018
Сообщений: 6,756
Записей в блоге: 4
14.01.2025, 09:22
Цитата Сообщение от OwenGlendower Посмотреть сообщение
я перевел свой код созданный на основе кода Andrey-MSK
Это не мой код Я его нашел на просторах сети - Sort Alphanumeric Method.

Нашел баг. Вот смотрите. Первоначальный вариант, обратите внимание на положение чертежа под номером 0000-HH
Сортировка массива

А вот ваш вариант
Сортировка массива

Позиция записи сместилась. Перевёл ваш код с VB на C# так
C# Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
using System;
using System.Collections.Generic;
 
namespace DBClient.Services.Sorters
{
    public class NaturalStringComparer : IComparer<string>
    {
        public static NaturalStringComparer Instance { get; } = new NaturalStringComparer();
 
        public int Compare(string x, string y)
        {
            if (x == null || y == null)
                return 0;
 
            int len1 = x.Length;
            int len2 = y.Length;
            int marker1 = 0;
            int marker2 = 0;
 
            while (marker1 < len1 && marker2 < len2)
            {
                bool isDigit1 = char.IsDigit(x[marker1]);
                bool isDigit2 = char.IsDigit(y[marker2]);
 
                int loc1 = 0;
                int loc2 = 0;
 
                do
                {
                    loc1 += 1;
                    marker1 += 1;
                } while (marker1 < len1 && char.IsDigit(x[marker1]) == isDigit1);
 
                do
                {
                    loc2 += 1;
                    marker2 += 1;
                } while (marker2 < len2 && char.IsDigit(y[marker2]) == isDigit2);
 
                int result;
 
                if (isDigit1 && isDigit2)
                {
                    long thisNumericChunk = long.Parse(x.AsSpan(marker1 - loc1, loc1));
                    long thatNumericChunk = long.Parse(y.AsSpan(marker2 - loc2, loc2));
 
                    result = thisNumericChunk.CompareTo(thatNumericChunk);
                }
                else
                {
                    result = string.Compare(x, marker1 - loc1, y, marker2 - loc2, Math.Min(loc1, loc2));
                }
 
                if (result != 0)
                    return result;
            }
 
            return len1 - len2;
        }
    }
}
1
Администратор
Эксперт .NET
 Аватар для OwenGlendower
17898 / 13994 / 5345
Регистрация: 17.03.2014
Сообщений: 28,652
Записей в блоге: 1
14.01.2025, 09:56
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Нашел баг. Вот смотрите. Первоначальный вариант, обратите внимание на положение чертежа под номером 0000-HH
Да, вижу. Можете скинуть строки текстом?

Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Это не мой код Я его нашел на просторах сети - Sort Alphanumeric Method.
Окей. Это ничего не меняет. Так или иначе код необходимо улучшить.
1
 Аватар для Andrey-MSK
3160 / 2057 / 375
Регистрация: 14.08.2018
Сообщений: 6,756
Записей в блоге: 4
14.01.2025, 10:13
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Да, вижу. Можете скинуть строки текстом?
Вот, выгрузил в Excel
Вложения
Тип файла: 7z Книга2.7z (20.6 Кб, 9 просмотров)
1
 Аватар для Andrey-MSK
3160 / 2057 / 375
Регистрация: 14.08.2018
Сообщений: 6,756
Записей в блоге: 4
14.01.2025, 15:33
OwenGlendower, Прогнал оба варианта в Debug. Ваш вариант в сравнении этого набора символов возвращает 1, а первоначальный -1, так как он продолжает разбор строки с символами до конца, а где после символа начинаются числа - останавливается и в итоге строке с числами уходит вверх.
Вот ваш вариант
Сортировка массива

Вот первоначальный
Сортировка массива
1
Администратор
Эксперт .NET
 Аватар для OwenGlendower
17898 / 13994 / 5345
Регистрация: 17.03.2014
Сообщений: 28,652
Записей в блоге: 1
14.01.2025, 15:58
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Прогнал оба варианта в Debug.
Я тоже уже немного подебажил и нашел один баг. Вместо Math.Min нужно использовать Math.Max. Тогда для строк "0000-03" и "0000-HH" оба варианта вернут -1.
2
 Аватар для Andrey-MSK
3160 / 2057 / 375
Регистрация: 14.08.2018
Сообщений: 6,756
Записей в блоге: 4
14.01.2025, 16:21
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Вместо Math.Min нужно использовать Math.Max
Да, вы правы, исправил
C# Скопировано
1
2
3
4
else
{
    result = string.Compare(x, marker1 - loc1, y, marker2 - loc2, Math.Max(loc1, loc2));
}
И заработало
Сортировка массива
0
 Аватар для Andrey-MSK
3160 / 2057 / 375
Регистрация: 14.08.2018
Сообщений: 6,756
Записей в блоге: 4
14.01.2025, 16:31
OwenGlendower, И в таком виде работает как надо
Сортировка массива
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.01.2025, 16:31
Помогаю со студенческими работами здесь

Сортировка массива
На вход подается текстовый файл с тысячью фамилий. Организовать сортировку по количеству упоминаний одной фамилии в этом файле в порядке...

Сортировка массива
Как организовать на VB подскажите пожалуста

Сортировка одномерного массива
Здравствуйте. До конца семестра меньше 2 недель, проболел месяц, требуется помощь/толчок к верному решению. Делал лабораторную,...

Сортировка двумерного массива
Задача:в неквадратной (5:4, допустим) матрице поменять местами столбцы. Первый с последним, второй с предпоследним и т.д. У меня на...

Сортировка массива дат
Доброго всем времени суток! Задача: В массиве имеются несколько элементов времени и дат по шаблону (hh:mm dd.mm.yyyy), т.е. час с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Результаты исследования от команды MCM (март 2025 г.)
Programma_Boinc 07.04.2025
Результаты исследования от команды MCM (март 2025 г. ) В рамках наших текущих исследований мы продолжаем изучать гены, которые имеют наибольшую вероятность развития рака легких, выявленные в рамках. . .
Рекурсивные типы в Python
py-thonny 07.04.2025
Рекурсивные типы - это типы данных, которые определяются через самих себя или в сочетании с другими типами, которые в свою очередь ссылаются на исходный тип. В мире программирования такие структуры. . .
C++26: Объединение и конкатенация последовательностей и диапазонов в std::ranges
NullReferenced 07.04.2025
Работа с последовательностями данных – одна из фундаментальных задач, с которой сталкивается каждый разработчик. C++ прошел длинный путь в эволюции средств для манипуляции коллекциями – от. . .
Обмен данными в микросервисной архитектуре
ArchitectMsa 06.04.2025
Когда разработчики начинают погружаться в мир микросервисов, они часто сталкиваются с парадоксальным правилом: "два сервиса не должны делить один источник данных". Эта мантра звучит повсюду в. . .
PostgreSQL в Kubernetes: Автоматизация обслуживания с CNPG
Mr. Docker 06.04.2025
Администраторы баз данных сталкиваются с целым рядом проблем при обслуживании PostgreSQL в Kubernetes: как обеспечить правильную репликацию данных, как настроить автоматическое переключение при. . .
Async/await в TypeScript
run.dev 06.04.2025
Асинхронное программирование — это подход к разработке программного обеспечения, при котором операции выполняются независимо друг от друга. В отличие от синхронного выполнения, где каждая последующая. . .
Многопоточность в C#: Синхронизация потоков
UnmanagedCoder 06.04.2025
Многопоточное программирование стало неотъемлемой частью разработки современных приложений на C#. С появлением многоядерных процессоров возможность выполнять несколько задач параллельно значительно. . .
TypeScript: Классы и конструкторы
run.dev 06.04.2025
TypeScript, как статически типизированный язык, построенный на основе JavaScript, привнес в веб-разработку новый уровень надежности и структурированности кода. Одним из важнейших элементов этой. . .
Многопоточное программирование: Rust против C++
golander 06.04.2025
C++ существует уже несколько десятилетий и его поддержка параллелизма постепенно наращивалась со временем. Начиная с C++11, язык получил стандартную библиотеку для работы с потоками, а в последующих. . .
std::vector в C++: от основ к оптимизации производительности
NullReferenced 05.04.2025
Для многих программистов знакомство с std::vector происходит на ранних этапах изучения языка, но между базовым пониманием и подлинным мастерством лежит огромная дистанция. Контейнер std::vector. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер