开发者

Linq - 'Saving' OrderBy operation (c#)

开发者 https://www.devze.com 2023-01-18 10:18 出处:网络
Assume I have generic list L of some type in c#. Then, using linq, call OrderBy() on it, passing开发者_StackOverflow in a lambda expression.

Assume I have generic list L of some type in c#. Then, using linq, call OrderBy() on it, passing开发者_StackOverflow in a lambda expression.

If I then re-assign the L, the previous order operation will obviously be lost.

Is there any way I can 'save' the lambda expression I used on the list before i reassigned it, and re-apply it?


Use a Func delegate to store your ordering then pass that to the OrderBy method:

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

As another example consider a Person class:

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
}

Now you want to preserve a sort order that sorts by the Name property. In this case the Func operates on a Person type (T) and the TResult will be a string since Name is a string and is what you are sorting by.

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

EDIT: be sure to add ToList() after the OrderBy calls if you need a List<T> since the LINQ methods will return an IEnumerable<T>.


Calling ToList() or ToArray() on your IEnumerable<T> will cause it to be immediately evaluated. You can then assign the resulting list or array to "save" your ordered list.

0

精彩评论

暂无评论...
验证码 换一张
取 消