알파벳순으로리스트


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>. 이를 위해, 당신은 고려하실 수 있습니다 ProjectionComparer에 MiscUtil .

(나는 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.