C# 按列名字符串对列表排序

C# 按列名字符串对列表排序,c#,list,sorting,C#,List,Sorting,比如说我有一门课是这样的 public class model { public int id{get;set;} public string name{get;set;} public string department{get;set;} } 我有一个型号列表 List<model> modelList = List<model>(); List modelList=List(); 如何按列名和排序方向对模型列表进行排序 我尝试的方式:

比如说我有一门课是这样的

public class model
{
    public int id{get;set;}
    public string name{get;set;}
    public string department{get;set;}
}
我有一个型号列表

List<model> modelList = List<model>();
List modelList=List();
如何按列名和排序方向对模型列表进行排序

我尝试的方式:

public List<model> sortModelList(string columnName, SortDirection direction)
{
   //Method 1:
   //The below code was unable to sort by column and unable to set the sort direction
   return modelList.Sort();

   //Method 2:
   //The below code was unable to sort by the columnName parameter and unable to set the sort direction
   return modelList.OrderBy(a=>a.name)

  //What I can do in order to sort the list by "columnName" parameter and set the sort direction? (Ascending / Descending)
}
public List sortModelList(字符串列名、SortDirection方向)
{
//方法1:
//下面的代码无法按列排序,也无法设置排序方向
返回modelList.Sort();
//方法2:
//下面的代码无法按columnName参数排序,也无法设置排序方向
返回modelList.OrderBy(a=>a.name)
//如何按“columnName”参数对列表进行排序并设置排序方向?(升序/降序)
}

如果需要将列名作为参数传递,则需要使用反射进行比较。您可以执行以下操作:

modelList.OrderBy(a => a.GetType().GetProperty(columnName).GetValue(a, null));

当然,您必须进行适当的空值检查等,我假设您能够处理这些问题。

正确的方法是编写客户比较函数

您需要知道的一切都可以在这里找到:


试试看,如果还是不行就回来。

我想你是在找

例如:

modelList.Sort((m1, m2) => string.Compare(m1.name, m2.name));
// descending
modelList.Sort((m1, m2) => -string.Compare(m1.name, m2.name));
OrderBy具有类似的灵活性,但返回一个新序列,该序列将被排序,而不是修改原始列表。因此,你可以:

var newList = modelList.OrderBy(m => m.name).ToList();
// descending
var newList = modelList.OrderByDescending(m => m.name).ToList();
< >指定要动态排序的属性,请考虑下面的代码:

public void SortList<T>(List<T> list, string columnName, SortDirection direction)
{
    var property = typeof(T).GetProperty(columnName);
    var multiplier = direction == SortDirection.Descending ? -1 : 1;
    list.Sort((t1, t2) => {
        var col1 = property.GetValue(t1);
        var col2 = property.GetValue(t2);
        return multiplier * Comparer<object>.Default.Compare(col1, col2);
    });
}
public void排序列表(列表列表、字符串列名、排序方向)
{
var property=typeof(T).GetProperty(columnName);
var乘数=方向==排序方向。下降?-1:1;
list.Sort((t1,t2)=>{
var col1=property.GetValue(t1);
var col2=property.GetValue(t2);
返回乘数*Comparer.Default.Compare(col1,col2);
});
}

在这里,您可以根据属性名称和排序方向创建动态表达式


步骤1:实现IComparer接口

public class SortByName : IComparer<Customer>
{
    public int Compare(Customer x, Customer y)
    {
        return x.Name.CompareTo(y.Name);
    }
}

简单的答案是,您需要一个客户比较功能。我相信,很快就会有人告诉你怎么做。看看这页上的帖子:但是有时候列表不会按名字排序,也就是说,有时候可能按id排序,也可能按部门排序,有没有办法用这个代码来做呢?谢谢!这有助于解决很多问题。例如,如果我想对国家/地区进行排序,我应该如何使用
public void public void SortList
<代码>国家=排序列表(国家,“columnName”,SortDirection.升序)给了我一个错误,无法将void转换为Collections.Generic.List。@VDWWD听起来您的列表类型不是
List
。您可以将您的类型更改为
List
,调用
ToList()
执行转换,或者更改SortList以采用您正在使用的类型。最后一个选项要求您使用的类型具有一个排序函数,该函数采用
比较
IComparer
谢谢,这正是我想要的:)
LINQ to Entities不识别方法“System.Object GetValue(System.Object,System.Object[])方法,而且这个方法不能被转换成存储表达式
,这就完全消除了使用iqueryable的必要性。
SortByName sortByName = new SortByName();
listModel.Sort(sortByName);