Linq 林奇';保存';OrderBy操作(c#)

Linq 林奇';保存';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)

假设我在c#中有某种类型的泛型list
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