Если проблема заключается в порядке типов в выводе, вы можете использовать пользовательский класс IComparer
и список Sort
, который вы перечисляете.
Основной принцип c состоит в том, что вы можете сопоставлять типы с целое число баллов, а затем вернуть сравнение между баллами.
См. документацию .
( dotnetFiddle )
public class StringThenIntThenDoubleThenChar : Comparer<object>
{
public override int Compare(object x, object y)
{
return GetTypeScore(x).CompareTo(GetTypeScore(y));
}
private int GetTypeScore(object o)
{
var type = o.GetType();
if (type == typeof(string)) return 0;
else if (type == typeof(int)) return 1;
else if (type == typeof(double)) return 2;
else if (type == typeof(char)) return 3;
else return 4;
/* Or, if you are using C# 8 :
return o.GetType() switch
{
Type t when t == typeof(string) => 0,
Type t when t == typeof(int) => 1,
Type t when t == typeof(double) => 2,
Type t when t == typeof(char) => 3,
_ => 4
};
*/
}
}
Используйте это следующим образом:
List<object> list = new List<object>() { 3, "cat", 4.1, 'a', 5, "dog", "horse", 9.1, 'd', 1 };
list.Sort(new StringThenIntThenDoubleThenChar());
list.ForEach(x => Console.WriteLine(x));
Преимущество перед уже предоставленным более простым решением (сортировка по имени типа) состоит в том, что вы можете настроить его по своему усмотрению. sh.
Вы также можете уточнить компаратор, например, если оценки равны, затем вы можете сравнить их, используя их порядок сравнения по умолчанию (так что string
, int
et c. соответственно отсортированы среди них).