【问题标题】:List<T> OrderBy Alphabetical OrderList<T> 按字母顺序排列
【发布时间】:2010-09-16 07:58:47
【问题描述】:

我在 Framework 3.5 上使用 C#。我希望快速对通用List&lt;T&gt; 进行排序。为了这个例子,假设我有一个Person 类型的列表,其属性为姓氏。如何使用 lambda 表达式对该列表进行排序?

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

【问题讨论】:

    标签: c# generics list lambda sorting


    【解决方案1】:

    如果您的意思是就地排序(即更新列表):

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

    如果您指的是新列表:

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

    【讨论】:

    • 我相信第一个想成为 people.Sort((x, y) => string.Compare(x.LastName, y.LastName)
    • @James:我不这么认为。比较 返回 int,而不是 bool。
    • 我想知道你是否想按名字和姓氏排序...你应该写什么?
    • var newList = people.OrderBy(x=>x.FirstName).ThenBy(x=>x.LastName).ToList();
    • @Faraz (x,y)=>x.price.CompareTo(y.price)
    【解决方案2】:

    您需要对列表进行就地排序,还是只是列表内容的有序序列?后者更容易:

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

    要进行就地排序,您需要IComparer&lt;Person&gt;Comparison&lt;Person&gt;。为此,您可能希望在MiscUtil 中考虑ProjectionComparer

    (我知道我一直在使用 MiscUtil - 它只是一直保持相关性......)

    【讨论】:

    • 这对我有用,但只有在我附加了“.ToList()”之后:contemporariesOrderedByBirthYear = contemporaries.OrderBy(contemp => contemp.BirthYear).ToList();
    • @B.ClayShannon:如果你想要List&lt;T&gt;,你需要它,但如果你只是想迭代,就不需要它。
    【解决方案3】:

    你可以使用 linq :) 使用 :

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

    【讨论】:

      【解决方案4】:
      people.OrderBy(person => person.lastname).ToList();
      

      【讨论】:

      • 好吧,这仍然没有捕捉到结果——你需要在左侧有一个“List people =”...
      • 这个答案展示了使用 LINQ 时最常见的错误 - 像 OrderBy 这样的方法 修改列表,而是返回新的“集合”(通常是懒惰的 IEnumerable&lt;T&gt;)需要分配给某事。
      • @AlexeiLevenkov 你怎么知道这是使用 LINQ 时最常见的错误?
      【解决方案5】:
      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】:

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

        • List.Sort()
        • List.Sort(通用比较)
        • List.Sort(通用 IComparer)
        • List.Sort (Int32, Int32, Generic IComparer)

        【讨论】:

        • Sort() 非常有用,尤其是当它是 List()
        【解决方案7】:

        你可以使用这个代码sn-p:

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

        其中New1List&lt;Employee&gt;

        EmpListList&lt;Employee&gt; 的变量。

        zEmployee 类型的变量。

        【讨论】:

        • 安舒曼,没有什么比var 类型的了。 New1List&lt;Employee&gt;zEmployee
        【解决方案8】:

        你也可以使用

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

        【讨论】:

        • 虽然这个代码示例可以回答这个问题,但它缺乏解释。就目前而言,它没有增加任何价值,并且承受着被否决/删除的变化。请添加一些解释是什么以及为什么它是 OP 问题的解决方案。
        【解决方案9】:

        这是一个通用的分拣机。使用下面的开关调用。

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

        【讨论】:

        • 我认为这太复杂了。正如您在其他答案中看到的那样,这一切都可以在一行中完成(这并不一定意味着在一行中完成它是好的,但我没有得到这样做的好处)
        • 这是用于使用 AngularJS 进行多列排序的。它本质上是单行排序,但它也设置了排序方向变量。如果你仔细观察它,它真的没有那么复杂。我想 Sort 函数对所有通用的东西有点吓人,但如果我把这个定义拿出来,它就是一个 1 行的 Sort 调用。
        • 对于 Op 的要求来说太复杂了。不过,对于不同的问题,这是一个很好的解决方案。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多