#c# #winforms
Вопрос:
private class MyComparer : IComparerlt;stringgt; { [DllImport("Shlwapi.dll", SetLastError = true, CharSet = CharSet.Unicode)] private static extern int StrCmpLogicalW(string psz1, string psz2); public int Compare(string psz1, string psz2) { return -StrCmpLogicalW(psz1, psz2); } }
Когда я добавляю минус в строку возврата, он сортирует массив от последнего элемента к первому. Без минуса он отсортирует массив и сохранит порядок от первого до последнего.
Минус просто делает сортировку также обратной для массива.
Я хочу каким-то образом создать bool, чтобы я мог выбрать, следует ли изменять массив или нет.
Использование :
Array.Sort(files, new MyComparer());
Я хочу иметь возможность решить, отменить это или нет, например, установив значение true или false :
Array.Sort(filesRadar, new MyComparer(false));
Если false, не отменяйте его, возвращайте без минуса, если true, добавьте минус.
Ответ №1:
Вы можете перейти reverse
в конструктор:
private class MyComparer : IComparerlt;stringgt; { // We may want to get rid of creation (see @aybe comment below) public static readonly MyComparer Ascending = new MyComparer(); public static readonly MyComparer Descending = new MyComparer(false); [DllImport("Shlwapi.dll", SetLastError = true, CharSet = CharSet.Unicode)] private static extern int StrCmpLogicalW(string psz1, string psz2); public int Compare(string psz1, string psz2) { return (Reverse ? -1 : 1) * StrCmpLogicalW(psz1, psz2); } public MyComparer(bool reverse) { Reverse = reverse; } public MyComparer() : MyComparer(false) {} public bool Reverse {get; private set;} }
Тогда вы можете поставить
Array.Sort(filesRadar, new MyComparer(false));
Или даже
Array.Sort(filesRadar, MyComparer.Ascending);
Комментарии:
1.
Reverse
можно достать-только.2. Вы также можете добавить что-то вроде
public static MyComparer Ascending { get; } = new MyComparer(true)
,public static MyComparer Descending { get; } = new MyComparer(false)
чтобы не создавать ненужные экземпляры.3. @aybe: да, это может быть написано как
public bool Reverse {get;}
, но я не знаю версию C#, используемую в вопросе, поэтому на всякий случай я использовал старомодный синтаксис4. @aybe: спасибо вам за
Ascending
Descending
идею; однако я поставилreadonly
реализацию на местах (чтобы ее можно было сравнить со старыми версиями c#)5. Не думал об этом, определенно имеет смысл!
Ответ №2:
Попробуйте что-нибудь вроде этого:
bool SortArrayReversed = false; if(SortArrayReversed == false) { Array.Sort(files); } else { Array.Sort(-files); }
Если вы хотите изменить способ сортировки массива, просто измените значение SortArrayReversed.