알파벳순으로리스트


443

Framework 3.5에서 C #을 사용하고 있습니다. Generic을 빠르게 정렬하려고 List<T>합니다. 이 예제를 위해 Personlastname 속성을 가진 유형 목록이 있다고 가정 해 봅시다 . 람다 식을 사용하여이 목록을 어떻게 정렬합니까?

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

답변:


696

전체 정렬을 의미하는 경우 (예 : 목록이 업데이트 됨) :

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

새로운 목록을 의미하는 경우 :

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

2
첫 번째는 사람들이되고 싶다고 생각합니다 .Sort ((x, y) => string.Compare (x.LastName, y.LastName) <0);
James Curran

36
@ 제임스 : 나는 그렇게 생각하지 않을 것입니다. 비교 <T>는 bool이 아닌 int를 반환합니다.
Jon Skeet

2
이름과 성으로 주문할 것인지 궁금합니다. 무엇을 작성해야합니까?
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

목록을 제자리에 정렬하거나 목록의 내용 순서대로 정렬해야합니까? 후자가 더 쉽습니다.

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

장소에 정렬하려면, 당신은 필요한 것 IComparer<Person>또는를 Comparison<Person>. 이를 위해, 당신은 고려하실 수 있습니다 ProjectionComparerMiscUtil .

(나는 MiscUtil을 계속 가져 오는 것을 알고 있습니다-그것은 단지 계속 관련성이 있습니다 ...)


1
이것은 나를 위해 일했지만 ".ToList ()"를 추가 한 후에 만 ​​가능했습니다. contemporariesOrderedByBirthYear = contemporaries.OrderBy (contemp => contemp.BirthYear) .ToList ();
B. Clay Shannon

2
@ B.ClayShannon : 글쎄 List<T>, 당신이 그것을 원한다면 그것을 필요로하지만, 반복하고 싶다면 그것을 필요로하지 않습니다.
Jon Skeet

23

linq :) 사용할 수 있습니다 :

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

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

17
글쎄, 그것은 여전히 ​​결과를 캡처하지 않습니다-당신은 왼쪽에 "List <Person> people ="이 필요합니다 ...
Marc Gravell

8
이 답변은 LINQ 메서드를 사용할 때 목록을 수정 OrderBy 하지 않고IEnumerable<T> 무언가에 할당해야하는 새로운 "컬렉션"(보통 게으른 )을 반환 할 때 가장 일반적인 오류 를 보여줍니다.
Alexei Levenkov

2
@AlexeiLevenkov 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

이 코드 스 니펫을 사용할 수 있습니다.

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

여기서 New1A는 List<Employee>.

EmpList의 변수입니다 List<Employee>.

zEmployee유형 의 변수입니다 .


AnshuMan, var유형 과 같은 것은 없습니다 . New1이다 List<Employee>하고 z있다 Employee.
nawfal

5

당신은 또한 사용할 수 있습니다

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

4
이 코드 샘플은 질문에 대답 할 수 있지만 설명이 부족합니다. 현재 상태이므로 값을 추가하지 않으며 다운 투표 / 삭제의 변경을 나타냅니다. 무엇을하고 왜 OP 문제에 대한 해결책인지 설명하십시오.
oɔɯǝɹ

0

이것은 일반적인 분류기입니다. 아래 스위치로 호출됩니다.

dvm.PagePermissions는 List T 유형의 ViewModel에 대한 속성입니다.이 경우 T는 page_permission이라는 EF6 모델 클래스입니다.

dvm.UserNameSortDir은 다음 정렬 방향을 보유하는 뷰 모델의 문자열 특성입니다. 뷰에서 실제로 사용되는 것.

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
나는 이것이 너무 복잡하다고 생각합니다. 다른 답변에서 볼 수 있듯이 한 줄로 모두 수행 할 수 있습니다 (한 줄로 수행하는 것이 좋다는 것을 의미하지는 않지만 이렇게하면 이점을 얻지 못합니다)
jalgames

AngularJS를 사용한 다중 열 정렬 용입니다. 기본적으로 단일 행 정렬이지만 정렬 방향 변수도 설정합니다. 자세히 보면 복잡하지 않습니다. Sort 함수는 모든 일반적인 것들에 약간의 위협이 될 것 같지만 그 정의를 꺼내면 1 줄 Sort 호출입니다.
howserss

Op가 요청한 내용이 너무 복잡합니다. 그래도 다른 문제에 대한 좋은 해결책입니다.
굴림
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.