代码之家  ›  专栏  ›  技术社区  ›  SaaS Developer

列表<T>按字母顺序排列

  •  484
  • SaaS Developer  · 技术社区  · 16 年前

    我在Framework 3.5上使用C#。我想快速排序一个通用 List<T> 为了这个例子,假设我有一个列表 Person 具有lastname属性的类型。如何使用lambda表达式对列表进行排序?

    List<Person> people = PopulateList();
    people.OrderBy(???? => ?????)
    
    10 回复  |  直到 7 年前
        1
  •  725
  •   Marc Gravell    16 年前

    如果您是指就地排序(即列表已更新):

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

    如果你是指一个新列表:

    var newList = people.OrderBy(x=>x.LastName).ToList(); // ToList optional
    
        2
  •  105
  •   Jon Skeet    16 年前

    您需要将列表排序到位,还是只需要列表内容的有序序列?后者更容易:

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

    要排序到位,您需要 IComparer<Person> 或a Comparison<Person> 为此,您或许可以考虑 ProjectionComparer 在……里面 MiscUtil .

    (我知道我一直在提起MiscUtil——它一直很重要……)

        3
  •  24
  •   Sparkup Andrey Solera    14 年前
    people.OrderBy(person => person.lastname).ToList();
    
        4
  •  24
  •   bluish dmajkic    13 年前

    您可以使用linq:)使用:

    System.linq;
    var newList = people.OrderBy(x=>x.Name).ToList();
    
        5
  •  14
  •   bluish dmajkic    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();
            }
        }
    }
    
        6
  •  5
  •   Iman    13 年前

    讲到我 this useful dummy guide - Sorting in Generic List - 工作。 它通过非常完整和清晰的解释和简单的示例帮助您理解完成这项工作的4种方法(过载)

    • 列表。排序()
    • 列表。排序(通用比较)
    • 列表。排序(通用IComparer)
    • 列表。排序(Int32、Int32、通用IComparer)
        7
  •  5
  •   jalgames    11 年前

    您可以使用以下代码片段:

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

    哪里 New1 是a List<Employee> .

    EmpList 是a的变量 列表<雇员> .

    z 是一个变量 Employee 类型。

        8
  •  5
  •   rosselder83    10 年前

    您还可以使用

    model.People = model.People.OrderBy(x => x.Name).ToList();
    
        9
  •  2
  •   jalgames    11 年前

    这是一个通用的分拣机。用下面的开关呼叫。

    dvm。PagePermissions是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;
        }