如何在 c# 中对动态列表进行排序

本文关键字:列表 排序 动态 | 更新日期: 2023-09-27 18:35:41

function void sortDynamicData(typeOfClass,SortKey)
{
List<dynamic> results = null; //results might be of any type it may contain students data or books data or professors data, hence I took as dynamic
results = services.GetMyresults(typeOfClass); //returns list of dynamic objects
results = results.OrderBy(SortKey).ToList();
 ...
 ...
 ...
}

我的问题是我想根据排序键对结果进行排序任何帮助都将非常可观。

如何在 c# 中对动态列表进行排序

如果可能的话,我认为如果你的数据是 T 列表而不是动态列表,使用起来更好、更容易

如果您无法将输入数据更改为列表:

public List<dynamic> Sort<T>(List<dynamic> input, string property)
{
    var type = typeof(T);   
    var sortProperty = type.GetProperty(property);
    return input.OrderBy(p => sortProperty.GetValue(p, null)).ToList();
}

用法:您需要在列表中提供数据类型,例如按名称对列表属性进行排序,其中动态为人员类型

var result = Sort<Person>(people, "Name");

====

============

更新:

如果您无法提供数据类型,可以尝试此 Sort()

public List<dynamic> Sort(List<dynamic> input, string property)
{   
    return input.OrderBy(p => p.GetType()
                               .GetProperty(property)
                               .GetValue(p, null)).ToList();
}

用法:

var people = new List<dynamic>
{
    new Person { Name = "Person 5" },
    new Person { Name = "Person 2" },
    new Person { Name = "Person 9" },
    new Person { Name = "Person 1" }
};  
var result = Sort(people, "Name");
var final = results.AsEnumerable().OrderBy(x => x[0])

1- 按一个字段排序

var personList = new List<dynamic>
{
    new { FullName = "Person 2" },
    new { FullName = "People 2" },
    new { FullName = "People 1" },
    new { FullName = "Person 1" }
};
    
List<dynamic> sortedPersonList = personList.AsEnumerable().OrderBy(x => x.FullName).ToList();

结果

{ FullName = "People 1" }
{ FullName = "People 2" }
{ FullName = "Person 1" }
{ FullName = "Person 2" }

2-按多个字段排序

var personList = new List<dynamic>
{
     new { FirstName = "Person", LastName = "2" },
     new { FirstName = "People", LastName = "2" },
     new { FirstName = "People", LastName = "1" },
     new { FirstName = "Person", LastName = "1" }
};
        
List<dynamic> sortedPersonList = personList.AsEnumerable().OrderBy(x => x.FirstName).ThenBy(x => x.LastName).ToList();

结果

{ FirstName = "People", LastName = "1" }
{ FirstName = "People", LastName = "2" }
{ FirstName = "Person", LastName = "1" }
{ FirstName = "Person", LastName = "2" }