Linq 林奇';保存';OrderBy操作(c#)
假设我在c#中有某种类型的泛型listLinq 林奇';保存';OrderBy操作(c#),linq,lambda,sql-order-by,Linq,Lambda,Sql Order By,假设我在c#中有某种类型的泛型listL。然后,使用linq对其调用OrderBy(),并传入一个lambda表达式 如果我随后重新分配L,则先前的订单操作显然将丢失 在重新分配之前,有没有办法“保存”列表中使用的lambda表达式,并重新应用它?使用a存储您的排序,然后将其传递给OrderBy方法: Func<int, int> orderFunc = i => i; // func for ordering var list = Enumerable.Range(1,10)
L
。然后,使用linq对其调用OrderBy()
,并传入一个lambda表达式
如果我随后重新分配L
,则先前的订单操作显然将丢失
在重新分配之前,有没有办法“保存”列表中使用的lambda表达式,并重新应用它?使用a存储您的排序,然后将其传递给OrderBy方法:
Func<int, int> orderFunc = i => i; // func for ordering
var list = Enumerable.Range(1,10).OrderByDescending(i => i); // 10, 9 ... 1
var newList = list.OrderBy(orderFunc); // 1, 2 ... 10
现在,您希望保留按Name
属性排序的排序顺序。在这种情况下,Func
对Person
类型(T
)进行操作,TResult
将是一个字符串,因为Name
是一个字符串,并且是您排序的依据
Func<Person, string> nameOrder = p => p.Name;
var list = new List<Person>
{
new Person { Id = 1, Name = "ABC" },
new Person { Id = 2, Name = "DEF" },
new Person { Id = 3, Name = "GHI" },
};
// descending order by name
foreach (var p in list.OrderByDescending(nameOrder))
Console.WriteLine(p.Id + ":" + p.Name);
// 3:GHI
// 2:DEF
// 1:ABC
// re-assinging the list
list = new List<Person>
{
new Person { Id = 23, Name = "Foo" },
new Person { Id = 14, Name = "Buzz" },
new Person { Id = 50, Name = "Bar" },
};
// reusing the order function (ascending by name in this case)
foreach (var p in list.OrderBy(nameOrder))
Console.WriteLine(p.Id + ":" + p.Name);
// 50:Bar
// 14:Buzz
// 23:Foo
Func nameOrder=p=>p.Name;
变量列表=新列表
{
新人{Id=1,Name=“ABC”},
新人{Id=2,Name=“DEF”},
新人{Id=3,Name=“GHI”},
};
//按名称降序排列
foreach(list.OrderByDescending(nameOrder)中的var p)
Console.WriteLine(p.Id+“:”+p.Name);
//3:GHI
//2:DEF
//1:ABC
//重新分配名单
列表=新列表
{
新人{Id=23,Name=“Foo”},
新人{Id=14,Name=“Buzz”},
新人{Id=50,Name=“Bar”},
};
//重用order函数(在本例中按名称升序)
foreach(list.OrderBy(nameOrder)中的var p)
Console.WriteLine(p.Id+“:”+p.Name);
//50:Bar
//14:嗡嗡声
//23:Foo
编辑:确保在调用
OrderBy
后添加ToList()
,如果您需要列表
,因为LINQ方法将返回IEnumerable
调用ToList()
或ToArray()IEnumerable上的
将立即对其进行评估。然后,您可以将生成的列表或数组分配给“保存”您的有序列表。@maxp太好了,很高兴能帮上忙!:)如果财产可以是任何东西呢?
Func<Person, string> nameOrder = p => p.Name;
var list = new List<Person>
{
new Person { Id = 1, Name = "ABC" },
new Person { Id = 2, Name = "DEF" },
new Person { Id = 3, Name = "GHI" },
};
// descending order by name
foreach (var p in list.OrderByDescending(nameOrder))
Console.WriteLine(p.Id + ":" + p.Name);
// 3:GHI
// 2:DEF
// 1:ABC
// re-assinging the list
list = new List<Person>
{
new Person { Id = 23, Name = "Foo" },
new Person { Id = 14, Name = "Buzz" },
new Person { Id = 50, Name = "Bar" },
};
// reusing the order function (ascending by name in this case)
foreach (var p in list.OrderBy(nameOrder))
Console.WriteLine(p.Id + ":" + p.Name);
// 50:Bar
// 14:Buzz
// 23:Foo