Я пытаюсь написать SortableBindingList, который я могу использовать для своего приложения. Я нашел много дискуссий о том, как осуществить базовую поддержку сортировки, так что BindingList сортируют при использовании в контексте DataGridView или какое-либо другое связанного управления, включая это сообщение StackOverflow:
DataGridView sort and e.g. BindingList<T> in .NETBindingList .Sort() вести себя как список <T> .Sort()
Все это очень полезно и я реализовал код, протестировал и т. д., и все это работает, но в моей конкретной ситуации мне нужно иметь возможность поддерживать простой вызов Sort() и использовать этот вызов по умолчанию для IComparable.CompareTo() сортировка, а не вызов ApplySortCore (PropertyDescriptor, ListSortDirection).
Причина в том, что у меня довольно много кода, который зависит от вызова Sort(), потому что этот конкретный класс, первоначально унаследованный от List, был недавно изменен как BindingList.
Так, у меня есть класс под названием VariableCode и класс коллекции VariableCodeList. VariableCode реализует IComparable и логику есть умеренно комплекс на основе нескольких свойств, и т.д ...
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?
}
}
Я сделал несколько неудачных попыток перепрофилирования метод ApplySortCore в Sort(), но то, что держит срыве я утверждаю, что ApplicationSortCore ожидает, что PropertyDescriptor будет выполнять свою работу, и я не могу понять, как это сделать, чтобы использовать логику IComparable.CompareTo().
Может кто-нибудь указать мне в правильном направлении?
Большое спасибо.
EDIT: Это окончательный код, основанный на ответе Марка для дальнейшего использования.
/// <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, Марк. Спасибо. Я продолжал думать, что я что-то упустил и что где-то будет какая-то поддержка, а не просто выполнение простого решения. Хорошая точка в уведомлениях. Я закончил использование списка внутренне, а не массивом, чтобы я мог поддерживать гибкую сортировку на основе делегатов (например, класс List ). Сообщение обновляется с окончательным кодом. –