Sto tentando di scrivere un SortableBindingList che posso utilizzare per la mia applicazione. Ho trovato un sacco di discussione su come implementare il supporto di base di ordinamento in modo che il BindingList ordinerà quando usato nel contesto di un DataGridView o qualche altro controllo associato compreso questo post da StackOverflow:
DataGridView sort and e.g. BindingList<T> in .NETBindingList <T> .Sort() per comportarsi come un elenco <T> .Sort()
Tutto ciò è molto utile e ho implementato il codice, testato, ecc. e tutto funziona, ma nella mia situazione particolare, devo essere in grado di supportare una semplice chiamata a Sort() e fare in modo che quella chiamata usi l'IComparable.CompareTo() predefinito per fare l'ordinamento, anziché effettuare una chiamata a ApplySortCore (PropertyDescriptor, ListSortDirection).
Il motivo è perché ho un bel po 'di codice che dipende dalla chiamata Sort() perché questa particolare classe originariamente ereditata da List e recentemente è stata modificata per essere una BindingList.
In modo specifico, ho una classe chiamata VariableCode e una classe di raccolta chiamata VariableCodeList. VariableCode implementa IComparable e la logica in là è moderatamente complessa basata su diverse proprietà, ecc ...
public class VariableCode : ... IComparable ...
{
public int CompareTo(object p_Target)
{
int output = 0;
//some interesting stuff here
return output;
}
}
public class VariableCodeList : SortableBindingList<VariableCode>
{
public void Sort()
{
//This is where I need help
// How do I sort this list using the IComparable
// logic from the class above?
}
}
Ho fatto un paio di tentativi falliti a riproporre il metodo ApplySortCore in sort(), ma ciò che mantiene contrastare io sono che ApplySortCore si aspetta che un PropertyDescriptor faccia il suo ordinamento e non riesco a capire come ottenerlo per usare la logica IComparable.CompareTo().
Qualcuno può indicarmi la giusta direzione?
Molte grazie.
MODIFICA: questo è il codice finale basato sulla risposta di Marc per riferimento futuro.
/// <summary>
/// Sorts using the default IComparer of T
/// </summary>
public void Sort()
{
sort(null, null);
}
public void Sort(IComparer<T> p_Comparer)
{
sort(p_Comparer, null);
}
public void Sort(Comparison<T> p_Comparison)
{
sort(null, p_Comparison);
}
private void sort(IComparer<T> p_Comparer, Comparison<T> p_Comparison)
{
m_SortProperty = null;
m_SortDirection = ListSortDirection.Ascending;
//Extract items and sort separately
List<T> sortList = new List<T>();
this.ForEach(item => sortList.Add(item));//Extension method for this call
if (p_Comparison == null)
{
sortList.Sort(p_Comparer);
}//if
else
{
sortList.Sort(p_Comparison);
}//else
//Disable notifications, rebuild, and re-enable notifications
bool oldRaise = RaiseListChangedEvents;
RaiseListChangedEvents = false;
try
{
ClearItems();
sortList.ForEach(item => this.Add(item));
}
finally
{
RaiseListChangedEvents = oldRaise;
ResetBindings();
}
}
Nice, Marc. Grazie. Continuavo a pensare che mi mancasse qualcosa e che ci sarebbe stato un supporto integrato da qualche parte, piuttosto che solo l'esecuzione della soluzione semplice. Buon punto anche per le notifiche. Mi sono ritrovato a utilizzare internamente un elenco anziché un array in modo da poter supportare anche l'ordinamento basato sui delegati flessibile (come i supporti di classe Elenco). Post viene aggiornato con il codice finale. –