OrderByDescending 通过 Lambda 表达式的项目计数
OrderByDescending by count of items via Lambda expressions
我有 MyClass 类型:
MyClass
{
public string Name { get;set; }
public string LastName { get;set; }
}
我也得到了我的collection:
List<MyClass> _Lst = new List<MyClass>();
我在其中添加了一些这样的项目:
更新:
_Lst.Add(new MyClass{Name = "Petya" , LastName = "sergeevi4"};
_Lst.Add(new MyClass{Name = "Vasya" , LastName = "petrovi4"};
_Lst.Add(new MyClass{Name = "Igori" , LastName = "alibertovi4"};
_Lst.Add(new MyClass{Name = "Vasya" , LastName = "iakubovi4"};
_Lst.Add(new MyClass{Name = "Vasya" , LastName = "ianukovi4"};
那么我如何通过 Lambda 表达式对我的 collection 进行排序(降序)以获得类似这样的结果:
_Lst[0] = Name = "Vasya" , LastName = "iakubovi4"; //Where [n] - just index of mylist;
_Lst[1] = Name = "Vasya" , LastName = "petrovi4";
_Lst[2] = Name = "Vasya" , LastName = "ianukovi4";
_Lst[3] = Name = "Petya" , LastName = "sergeevi4";
_Lst[4] = Name = "Igori" , LastName = "alibertovi4";
目前我正在做这样的事情:
var NewList = _Lst.OrderByDescending(x => x.Name.Count());
但是,不能正常工作。
只需将您的代码更改为,
var NewList = _Lst.OrderByDescending(x => x.Name);
GroupBy
方法完全符合您的要求。组是带有键(在本例中为名称)的 collection。您可以订购分组,然后使用 SelectMany
:
展平您的 collection
var newList = _Lst.GroupBy(m => m.Name)
.OrderByDescending(g => g.Count())
.SelectMany(g => g)
.ToList();
一条建议:使用 ToArray()
比 ToList()
更好,因为结果 collection 是不可变的,事后无法修改,导致棘手的错误在你的代码的其他地方。
奖金:
按名字匹配排序后,您可能想按姓氏字母顺序排序。同样,这很容易,因为每个组都是 collection。您可以在链中添加 Select
以实现此目的:
var newList = _Lst.GroupBy(m => m.Name)
.OrderByDescending(g => g.Count())
.Select(g => g.OrderBy(m => m.LastName))
.SelectMany(g => g)
.ToList();
List<MyClass> _Lst = new List<MyClass>();
_Lst.Add(new MyClass { Name = "Vasya", LastName = "iakubovi4" });
_Lst.Add(new MyClass { Name = "Vasya", LastName = "petrovi4" });
_Lst.Add(new MyClass { Name = "Vasya", LastName = "ianukovi4" });
_Lst.Add(new MyClass { Name = "Petya", LastName = "sergeevi4" });
_Lst.Add(new MyClass { Name = "Igori", LastName = "alibertovi4" });
var result = _Lst.GroupBy(m => m.Name).OrderByDescending(x => x.Count()).SelectMany(x => x).ToList();
我有 MyClass 类型:
MyClass
{
public string Name { get;set; }
public string LastName { get;set; }
}
我也得到了我的collection:
List<MyClass> _Lst = new List<MyClass>();
我在其中添加了一些这样的项目:
更新:
_Lst.Add(new MyClass{Name = "Petya" , LastName = "sergeevi4"};
_Lst.Add(new MyClass{Name = "Vasya" , LastName = "petrovi4"};
_Lst.Add(new MyClass{Name = "Igori" , LastName = "alibertovi4"};
_Lst.Add(new MyClass{Name = "Vasya" , LastName = "iakubovi4"};
_Lst.Add(new MyClass{Name = "Vasya" , LastName = "ianukovi4"};
那么我如何通过 Lambda 表达式对我的 collection 进行排序(降序)以获得类似这样的结果:
_Lst[0] = Name = "Vasya" , LastName = "iakubovi4"; //Where [n] - just index of mylist;
_Lst[1] = Name = "Vasya" , LastName = "petrovi4";
_Lst[2] = Name = "Vasya" , LastName = "ianukovi4";
_Lst[3] = Name = "Petya" , LastName = "sergeevi4";
_Lst[4] = Name = "Igori" , LastName = "alibertovi4";
目前我正在做这样的事情:
var NewList = _Lst.OrderByDescending(x => x.Name.Count());
但是,不能正常工作。
只需将您的代码更改为,
var NewList = _Lst.OrderByDescending(x => x.Name);
GroupBy
方法完全符合您的要求。组是带有键(在本例中为名称)的 collection。您可以订购分组,然后使用 SelectMany
:
var newList = _Lst.GroupBy(m => m.Name)
.OrderByDescending(g => g.Count())
.SelectMany(g => g)
.ToList();
一条建议:使用 ToArray()
比 ToList()
更好,因为结果 collection 是不可变的,事后无法修改,导致棘手的错误在你的代码的其他地方。
奖金:
按名字匹配排序后,您可能想按姓氏字母顺序排序。同样,这很容易,因为每个组都是 collection。您可以在链中添加 Select
以实现此目的:
var newList = _Lst.GroupBy(m => m.Name)
.OrderByDescending(g => g.Count())
.Select(g => g.OrderBy(m => m.LastName))
.SelectMany(g => g)
.ToList();
List<MyClass> _Lst = new List<MyClass>();
_Lst.Add(new MyClass { Name = "Vasya", LastName = "iakubovi4" });
_Lst.Add(new MyClass { Name = "Vasya", LastName = "petrovi4" });
_Lst.Add(new MyClass { Name = "Vasya", LastName = "ianukovi4" });
_Lst.Add(new MyClass { Name = "Petya", LastName = "sergeevi4" });
_Lst.Add(new MyClass { Name = "Igori", LastName = "alibertovi4" });
var result = _Lst.GroupBy(m => m.Name).OrderByDescending(x => x.Count()).SelectMany(x => x).ToList();