Как отсортировать элементы класса по возрастанию
public void button1_Click(object sender, EventArgs e)
{
Road three = new Road { startPoint = "three", endPoint = "three", numRoad = 3 };
Road one = new Road { startPoint = "one", endPoint = "one", numRoad = 1 };
Road two = new Road { startPoint = "two", endPoint = "two", numRoad = 2 };
}
public class Road
{
public String startPoint;
public String endPoint;
public int numRoad;
}
Есть такой вот код, нужно вывести элементы класса Road отсортированные по полю numRoad по возрастанию. Не могу никак разобраться....
Ответы (2 шт):
В C# (.NET) вы можете сортировать массивы и списки, так что вам надо поместить ваши элементы в массив или в список.
В обоих случаях либо полагаетесь на порядок сортировки по умолчанию, либо пишите свою функцию сравнения, так называемый компаратор.
Функция-компаратор получает два параметра и возвращает целое число.
Если число положительное, то первый элемент больше второго.
Если отрицательное, то второй элемент больше первого.
Если число равно нулю, элементы равны.
Пример такой функции для типа Road:
private static int RoadComparator(Road value1, Road value2)
{
if (value1.numRoad > value2.numRoad)
return 1;
if (value1.numRoad < value2.numRoad)
return -1;
return 0;
}
Вы можете его упростить, вызывая компаратор целых чисел для поля numRoad:
private static int RoadComparator(Road value1, Road value2)
{
return value1.numRoad.CompareTo(value2.numRoad);
}
Компаратор можно реализовать как метод интерфейса IComparable<T>, но это, как говорят программисты, бойлерплейт, то есть многословное решение, которое мы вынуждены писать, потому что таковы ограничения языка или фреймворка.
Для класса List<T> компаратор можно записать как лямбда-функцию, это занимает гораздо меньше места.
List<Road> list = new List<Road>
{
new Road { startPoint = "three", endPoint = "three", numRoad = 3 },
new Road { startPoint = "one", endPoint = "one", numRoad = 1 },
new Road { startPoint = "two", endPoint = "two", numRoad = 2 },
};
list.Sort((x, y) => x.numRoad.CompareTo(y.numRoad));
Еще возможен вариант сортировки по вложенным полям класса через Linq
List<Road> roads = new List<Road>
{
new Road { startPoint = "three", endPoint = "three", numRoad = 3 },
new Road { startPoint = "one", endPoint = "one", numRoad = 1 },
new Road { startPoint = "two", endPoint = "two", numRoad = 2 },
};
var sortedRoads = roads.OrderBy(r => r.numRoad).ToList();