Вопрос

У меня есть несколько объектов, все из одного класса (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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top