C# 列表<;T>;按字母顺序排列

C# 列表<;T>;按字母顺序排列,c#,generics,list,lambda,sorting,C#,Generics,List,Lambda,Sorting,我在框架3.5上使用C#。我正在寻找快速排序一个通用的列表。在本例中,假设我有一个属性为lastname的Person类型的列表。如何使用lambda表达式对该列表进行排序 List<Person> people = PopulateList(); people.OrderBy(???? => ?????) List people=PopulateList(); 人员。订购人(????=>??) 您需要对列表进行适当排序,还是只需要按列表内容的顺序排序?后者更容易: var

我在框架3.5上使用C#。我正在寻找快速排序一个通用的
列表
。在本例中,假设我有一个属性为lastname的
Person
类型的列表。如何使用lambda表达式对该列表进行排序

List<Person> people = PopulateList();
people.OrderBy(???? => ?????)
List people=PopulateList();
人员。订购人(????=>??)

您需要对列表进行适当排序,还是只需要按列表内容的顺序排序?后者更容易:

var peopleInOrder = people.OrderBy(person => person.LastName);
要进行适当排序,您需要一个
i比较程序
比较程序
。为此,您可能希望在

中考虑<代码>投影比较器< /代码>。
(我知道我一直在提MiscUtil-它只是一直相关…

如果您指的是就地排序(即列表已更新):

如果您指的是新列表:

var newList = people.OrderBy(x=>x.LastName).ToList(); // ToList optional
private void SortGridGenerico(
参考列表lista
,排序方向排序
,字符串propriedDeaOrdenar)
{
如果(!string.IsNullOrEmpty(propriedDeaOrdenar)
&&lista!=null
&&列表a.计数>0)
{
类型t=lista[0].GetType();
if(sort==SortDirection.升序)
{
lista=lista.OrderBy(
a=>t.InvokeMember(
所有权人
,System.Reflection.BindingFlags.GetProperty
无效的
A.
无效的
)
).ToList();
}
其他的
{
lista=lista.OrderByDescending(
a=>t.InvokeMember(
所有权人
,System.Reflection.BindingFlags.GetProperty
无效的
A.
无效的
)
).ToList();
}
}
}
对我来说很有效。 它通过非常完整、清晰的解释和简单的示例帮助您理解完成这项工作的4种方法(重载)

  • List.Sort()
  • List.Sort(一般比较)
  • List.Sort(通用IComparer)
  • List.Sort(Int32、Int32、通用IComparer)
您可以使用linq:)使用:


您可以使用以下代码段:

var New1 = EmpList.OrderBy(z => z.Age).ToList();
其中
New1
是一个
列表

EmpList
列表的变量


z
是员工类型的变量。

这是一个通用分拣机。用下面的开关呼叫

dvm.PagePermissions是my ViewModel上类型为的属性 列表T在本例中,T是一个名为page_permission的EF6模型类

dvm.UserNameSortDir是viewmodel上的一个字符串属性,用于保存下一个排序方向。视图中实际使用的一个

switch (sortColumn)
{
    case "user_name":
        dvm.PagePermissions = Sort(dvm.PagePermissions, p => p.user_name, ref sortDir);
        dvm.UserNameSortDir = sortDir;
        break;
    case "role_name":
        dvm.PagePermissions = Sort(dvm.PagePermissions, p => p.role_name, ref sortDir);
        dvm.RoleNameSortDir = sortDir;
        break;
    case "page_name":
        dvm.PagePermissions = Sort(dvm.PagePermissions, p => p.page_name, ref sortDir);
        dvm.PageNameSortDir = sortDir;
        break;
}                 


public List<T> Sort<T,TKey>(List<T> list, Func<T, TKey> sorter, ref string direction)
    {
        if (direction == "asc")
        {
            list = list.OrderBy(sorter).ToList();
            direction = "desc";
        }
        else
        {
            list = list.OrderByDescending(sorter).ToList();
            direction = "asc";
        }
        return list;
    }
开关(sortColumn)
{
案例“用户名”:
dvm.PagePermissions=排序(dvm.PagePermissions,p=>p.user\u name,ref sortDir);
dvm.UserNameSortDir=sortDir;
打破
案例“角色名称”:
dvm.PagePermissions=Sort(dvm.PagePermissions,p=>p.role\u name,ref sortDir);
dvm.RoleNameSortDir=sortDir;
打破
案例“页面名称”:
dvm.PagePermissions=Sort(dvm.PagePermissions,p=>p.page\u name,ref sortDir);
dvm.PageNameSortDir=sortDir;
打破
}                 
公共列表排序(列表、功能分类器、参考字符串方向)
{
如果(方向=“asc”)
{
list=list.OrderBy(sorter.ToList();
direction=“desc”;
}
其他的
{
list=list.OrderByDescending(sorter.ToList();
方向=“asc”;
}
退货清单;
}
您也可以使用

model.People = model.People.OrderBy(x => x.Name).ToList();

我相信第一个人想成为人。排序((x,y)=>string.Compare(x.LastName,y.LastName)<0)@詹姆斯:我不这么认为。比较返回int,而不是bool。我想知道是否要按Firstname和Lastname排序。。。你应该写什么呢?var newList=people.OrderBy(x=>x.FirstName).ThenBy(x=>x.LastName.ToList()@Faraz(x,y)=>x.price.CompareTo(y.price)好吧,这仍然不能捕获结果-您需要一个“List people=”在左手边…这个答案说明了使用LINQ时最常见的错误-像
OrderBy
这样的方法不修改列表,而是返回新的“collection”(通常是lazy
IEnumerable
)需要分配给某个对象。@AlexeiLevenkov你怎么知道这是使用LINQ时最常见的错误?AnshuMan,没有什么比
var
类型更好的了
New1
List
z
Employee
。我认为这太复杂了。正如您在其他答案中所看到的,所有这些都可以在一行中完成(这并不一定意味着在一行中完成是好的,但我没有这样做的优势),这是使用AngularJS进行多列排序。它本质上是单行排序,但也设置了sort diretion变量。如果你仔细看的话,它真的没有那么复杂。我猜排序函数对于所有的泛型东西都有点吓人,但是如果我去掉这个定义,它是一个1行排序调用。对于Op所要求的太复杂了。这是一个很好的解决不同问题的方法。虽然这个代码示例可以回答这个问题,但它缺乏解释。就目前的情况而言,它没有增加任何价值,并且经受着被否决/删除的变化。请添加一些解释,说明is是做什么的,以及为什么它是OP问题的解决方案。这对我有效,但只有在我添加了“.ToList()”:contemporariesOrderedByBirthYear=contemporaries.OrderBy(contemp=>contemp.BirthYear).ToList()之后@B.ClayShannon:如果你想要一个
列表,你需要它,但是如果你只是想迭代,你不需要它。
System.linq;
var newList = people.OrderBy(x=>x.Name).ToList();
var New1 = EmpList.OrderBy(z => z.Age).ToList();
switch (sortColumn)
{
    case "user_name":
        dvm.PagePermissions = Sort(dvm.PagePermissions, p => p.user_name, ref sortDir);
        dvm.UserNameSortDir = sortDir;
        break;
    case "role_name":
        dvm.PagePermissions = Sort(dvm.PagePermissions, p => p.role_name, ref sortDir);
        dvm.RoleNameSortDir = sortDir;
        break;
    case "page_name":
        dvm.PagePermissions = Sort(dvm.PagePermissions, p => p.page_name, ref sortDir);
        dvm.PageNameSortDir = sortDir;
        break;
}                 


public List<T> Sort<T,TKey>(List<T> list, Func<T, TKey> sorter, ref string direction)
    {
        if (direction == "asc")
        {
            list = list.OrderBy(sorter).ToList();
            direction = "desc";
        }
        else
        {
            list = list.OrderByDescending(sorter).ToList();
            direction = "asc";
        }
        return list;
    }
model.People = model.People.OrderBy(x => x.Name).ToList();