Как я могу использовать флаг bool, чтобы решить, использовать обратный или нет в классе MyComparer?

#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.