Danh sách <T> OrderBy Thứ tự chữ cái


442

Tôi đang sử dụng C # trên Framework 3.5. Tôi đang tìm cách nhanh chóng sắp xếp một Chung List<T>. Vì lợi ích của ví dụ này, giả sử tôi có Danh sách Personloại có thuộc tính họ. Làm cách nào để sắp xếp Danh sách này bằng biểu thức lambda?

List<Person> people = PopulateList();
people.OrderBy(???? => ?????)

Câu trả lời:


695

Nếu bạn có nghĩa là sắp xếp tại chỗ (tức là danh sách được cập nhật):

people.Sort((x, y) => string.Compare(x.LastName, y.LastName));

Nếu bạn có nghĩa là một danh sách mới:

var newList = people.OrderBy(x=>x.LastName).ToList(); // ToList optional

2
Tôi tin rằng người đầu tiên muốn trở thành người.Sort ((x, y) => string.Compare (x.LastName, y.LastName) <0);
James Curran

36
@James: Tôi sẽ không nghĩ như vậy. So sánh <T> trả về int, không phải bool.
Jon Skeet

2
Tôi tự hỏi nếu bạn muốn OrderBy Firstname và Lastname ... bạn nên viết gì?
balexandre

63
var newList = people.OrderBy (x => x.FirstName) .ThenBy (x => x.LastName) .ToList ();
Marc Gravell

4
@Faraz (x, y) => x.price.CompareTo (y.price)
Marc Gravell

98

Bạn có cần danh sách để được sắp xếp tại chỗ, hoặc chỉ một chuỗi theo thứ tự các nội dung của danh sách? Cái sau dễ hơn:

var peopleInOrder = people.OrderBy(person => person.LastName);

Để sắp xếp tại chỗ, bạn cần một IComparer<Person>hoặc a Comparison<Person>. Đối với điều đó, bạn có thể muốn xem xét ProjectionComparertrong MiscUtil .

(Tôi biết rằng tôi tiếp tục đưa MiscUtil lên - nó cứ liên quan ...)


1
Điều này làm việc cho tôi, nhưng chỉ sau khi tôi thêm ".ToList ()": contemporariesOrderedByBirthYear = contemporaries.OrderBy (contemp => contemp.BirthYear) .ToList ();
B. Clay Shannon

2
@ B.ClayShannon: Vâng, bạn cần điều đó nếu bạn muốn List<T>, nhưng bạn không cần nó nếu bạn chỉ muốn lặp lại.
Jon Skeet

23

bạn có thể sử dụng linq :) bằng cách sử dụng:

System.linq;
var newList = people.OrderBy(x=>x.Name).ToList();

23
people.OrderBy(person => person.lastname).ToList();

17
Chà, điều đó vẫn không nắm bắt được kết quả - bạn cần một "Danh sách <Person> people =" ở phía bên tay trái ...
Marc Gravell

8
Câu trả lời này cho thấy lỗi phổ biến nhất khi sử dụng LINQ - các phương thức như OrderBy không sửa đổi danh sách, mà trả về "bộ sưu tập" mới (thường là lười biếng IEnumerable<T>) cần được gán cho một cái gì đó.
Alexei Levenkov

2
@AlexeiLevenkov làm sao bạn biết đây là lỗi phổ biến nhất khi sử dụng LINQ?
tymtam

13
private void SortGridGenerico< T >(
          ref List< T > lista       
    , SortDirection sort
    , string propriedadeAOrdenar)
{

    if (!string.IsNullOrEmpty(propriedadeAOrdenar)
    && lista != null
    && lista.Count > 0)
    {

        Type t = lista[0].GetType();

        if (sort == SortDirection.Ascending)
        {

            lista = lista.OrderBy(
                a => t.InvokeMember(
                    propriedadeAOrdenar
                    , System.Reflection.BindingFlags.GetProperty
                    , null
                    , a
                    , null
                )
            ).ToList();
        }
        else
        {
            lista = lista.OrderByDescending(
                a => t.InvokeMember(
                    propriedadeAOrdenar
                    , System.Reflection.BindingFlags.GetProperty
                    , null
                    , a
                    , null
                )
            ).ToList();
        }
    }
}


5

Bạn có thể sử dụng đoạn mã này:

var New1 = EmpList.OrderBy(z => z.Age).ToList();

nơi New1là một List<Employee>.

EmpListlà biến của a List<Employee>.

zlà một biến của Employeeloại.


AnshuMan, không có gì giống như một varloại. New1List<Employee>zEmployee.
nawfal

5

Bạn cũng có thể dùng

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

4
Trong khi mẫu mã này có thể trả lời câu hỏi, nó thiếu giải thích. Hiện tại, nó không có giá trị và thay đổi bị giảm / xóa. Vui lòng thêm một số giải thích những gì được thực hiện và tại sao nó là một giải pháp cho vấn đề của OP.
oɔɯǝɹ 2/2/2015

0

Đây là một sắp xếp chung chung. Được gọi với công tắc dưới đây.

dvm.PagePermissions là một thuộc tính trên ViewModel loại Danh sách T của tôi trong trường hợp này T là lớp mô hình EF6 được gọi là page_ allow.

dvm.UserNameSortDir là một thuộc tính chuỗi trên viewmodel giữ hướng sắp xếp tiếp theo. Một trong đó được sử dụng Actaully trong chế độ xem.

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;
    }

1
Tôi nghĩ rằng đây là cách quá phức tạp. Như bạn có thể thấy trong các câu trả lời khác, tất cả có thể được thực hiện trong một dòng duy nhất (điều đó không nhất thiết có nghĩa là thực hiện trong một dòng duy nhất là tốt, nhưng tôi không có lợi thế khi làm như thế này)
jasmames

Điều này là để sắp xếp nhiều cột bằng AngularJS. Nó thực chất là sắp xếp dòng đơn nhưng nó cũng đặt biến diretion sắp xếp. Nó thực sự không phức tạp nếu bạn nhìn kỹ vào nó. Tôi đoán hàm Sắp xếp hơi đáng sợ với tất cả các công cụ chung nhưng nếu tôi lấy định nghĩa đó ra thì đó là cuộc gọi Sắp xếp 1 dòng.
kêu

Quá phức tạp cho những gì Op yêu cầu. Đó là một giải pháp tốt cho một vấn đề khác.
cuộn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.