Liste <T> Alfabetik Sırayla


443

Framework 3.5 üzerinde C # kullanıyorum. Bir Generic'i hızlı bir şekilde sıralamak istiyorum List<T>. Bu örnek uğruna Person, soyadı özelliğine sahip bir tür Listem olduğunu varsayalım. Bu Listeyi lambda ifadesi kullanarak nasıl sıralayabilirim?

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

Yanıtlar:


696

Yerinde bir sıralama kastediyorsanız (ör. Liste güncellenir):

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

Yeni bir liste demek istiyorsanız:

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

2
İlki insanlar olmak istediğine inanıyorum.Sort ((x, y) => string.Compare (x.LastName, y.LastName) <0);
James Curran

36
@ James: Ben öyle düşünmezdim. Karşılaştırma <T>, bool yerine int döndürür.
Jon Skeet

2
Acemi ve Soyadı ile sipariş vermek ister misiniz? Ne yazmalısınız?
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

Listenin yerinde sıralanmasına mı yoksa sadece listenin içeriğinin sıralı bir sırasına mı ihtiyacınız var? İkincisi daha kolaydır:

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

Yerinde sıralamak için bir IComparer<Person>veya a gerekir Comparison<Person>. Bunun için, düşünebilirsiniz ProjectionCompareriçinde MiscUtil .

(MiscUtil'i yükseltmeye devam ettiğimi biliyorum - sadece alakalı olmaya devam ediyor ...)


1
Bu benim için çalıştı ancak yalnızca ".ToList ()" ifadesini ekledikten sonra: contemporariesOrderedByBirthYear = contemporaries.OrderBy (contemp => contemp.BirthYear) .ToList ();
B. Clay Shannon

2
@ B.ClayShannon: İsterseniz buna ihtiyacınız var List<T>, ancak yinelemek istiyorsanız buna ihtiyacınız yok.
Jon Skeet

23

kullanarak linq :) kullanabilirsiniz:

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

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

17
Bu hala sonucu yakalamıyor - sol tarafta bir "Liste <Kişi> insanlar =" gerekir ...
Marc Gravell

8
LINQ kullanarak Bu cevap demonstates en yaygın hata - yöntemleri gibi OrderBy değil (genellikle tembel listesinde değişiklik, daha çok yeni "koleksiyonunu" return IEnumerable<T>) bu ihtiyacı şeye atanacak.
Alexei Levenkov

2
@AlexeiLevenkov Bunun LINQ kullanırken en yaygın hata olduğunu nereden biliyorsunuz?
Timtam

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

benim için bu yararlı kukla kılavuzu - Genel Listede Sıralama - çalıştı. bu işi çok eksiksiz ve net açıklamalar ve basit örneklerle yapmanın 4 yolunu (aşırı yükleme) anlamanıza yardımcı olur

  • List.Sort ()
  • List.Sort (Genel Karşılaştırma)
  • List.Sort (Genel IComparer)
  • List.Sort (Int32, Int32, Genel IComparer)

5

Bu kod snippet'ini kullanabilirsiniz:

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

nerede New1a List<Employee>.

EmpListdeğişkeni a değişkenidir List<Employee>.

zEmployeetüründe bir değişkendir .


AnshuMan, vartip gibi bir şey yok . New1olduğunu List<Employee>ve zolduğunu Employee.
nawfal

5

Ayrıca kullanabilirsiniz

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

4
Bu kod örneği soruyu cevaplayabilirken, açıklama eksiktir. Şu an olduğu gibi, hiçbir değer katmıyor ve aşağı düşürülme / silme değişikliğini duruyor. Lütfen ne yaptığını ve neden OP sorununa bir çözüm olduğunu açıklayın.
o

0

Bu genel bir sıralayıcıdır. Aşağıdaki anahtarla çağrılır.

dvm.PagePermissions, Liste T türündeki ViewModel üzerinde bulunan bir özelliktir, bu durumda T, page_permission adı verilen bir EF6 model sınıfıdır.

dvm.UserNameSortDir, viewmodel üzerinde bir sonraki sıralama yönünü tutan bir dize özelliğidir. Görünümde actaully kullanılan.

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
Bunun çok karmaşık olduğunu düşünüyorum. Diğer cevaplarda da görebileceğiniz gibi, hepsi tek bir satırda yapılabilir (tek bir satırda yapmanın iyi olduğu anlamına gelmez, ancak böyle yapmanın avantajını elde edemiyorum)
jalgames

Bu AngularJS kullanarak çoklu sütun sıralaması içindir. Temelde tek satırlı sıralamadır ancak sıralama diretion değişkenini de ayarlar. Eğer yakından bakarsanız o kadar da karmaşık değil. Ben sıralama fonksiyonu tüm genel şeyler ile biraz korkutucu ama bu tanımı çıkardı eğer 1 satır Sırala çağrı sanırım.
howserss

Op'un talep ettiği şey için çok karmaşık. Yine de farklı bir sorun için iyi bir çözümdür.
rulolar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.