Альтернатива сортировки списка в С#
-
11-09-2019 - |
Вопрос
У меня есть несколько объектов, все из одного класса (ColorNum). Каждый объект имеет 2 переменных-члена (m_Color и m_Number).
Пример:
ColorNum1(Red,25)
ColorNum2(Blue,5)
ColorNum3(Red,11)
ColorNum4(White,25)
4 объекта находятся в ColorNumList.
List<ColorNum> ColorNumList = new List<ColorNum>();
Теперь я хочу упорядочить список, чтобы объекты с mColor = «Red» находились вверху.Меня не волнует порядок остальных объектов.
Как должен выглядеть мой метод предиката?
Решение
Использование linq:
var sortedRedAtTop =
from col in ColorNumList
order by col.Color == Red ? 1 : 2
select col;
Или метод сортировки списка:
ColorNumList.Sort( (x,y) =>
(x.Color == Red ? 1 : 2)-(y.Color == Red ? 1 : 2) );
Другие советы
ColorNumList.Sort((x, y) => x.m_Color == Red ? 1 : (y.m_Color == Red ? -1 : 0));
Видеть http://msdn.microsoft.com/en-us/library/system.array.sort(VS.71).aspx
[C#] public static void Sort(Array, Array, int, int, IComparer);
Вам необходимо реализовать функцию, которая сравнивает два объекта и возвращает значение, указывающее, является ли один из них меньше, равен или больше другого.
http://msdn.microsoft.com/en-us/library/system.collections.icomparer.compare(VS.71).aspx
Вам нужно написать класс, реализующий интерфейс IComparer.
Я не использовал C#, но вот эквивалент VB:
Class ColorCompare реализует Icomparer
Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
Dim xc As ColorNum = TryCast(x, ColorNum)
Dim yc As ColorNum = TryCast(y, ColorNum)
If x.color = Red Then
Return 1
ElseIf y.color = Red Then
Return -1
Else
Return 0
End If
End Function
End Class