ChatGPT解决这个技术问题 Extra ChatGPT

List<T> 按字母顺序排列

我在 Framework 3.5 上使用 C#。我希望快速对通用 List<T> 进行排序。就本示例而言,假设我有一个 Person 类型的 List,其属性为 lastname。我将如何使用 lambda 表达式对该列表进行排序?

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

M
Marc Gravell

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

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) < 0);
@James:我不这么认为。比较 返回 int,而不是 bool。
我想知道您是否要 OrderBy Firstname 和 Lastname ......您应该写什么?
var newList = people.OrderBy(x=>x.FirstName).ThenBy(x=>x.LastName).ToList();
@Faraz (x,y)=>x.price.CompareTo(y.price)
J
Jon Skeet

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

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

要进行就地排序,您需要一个 IComparer<Person> 或一个 Comparison<Person>。为此,您不妨考虑 MiscUtil 中的 ProjectionComparer

(我知道我一直在提出 MiscUtil - 它只是一直相关......)


这对我有用,但只有在我附加了“.ToList()”之后: contemporariesOrderedByBirthYear = contemporaries.OrderBy(contemp => contemp.BirthYear).ToList();
@B.ClayShannon:如果你想要一个 List<T>,你需要它,但如果你只是想迭代,你就不需要它。
S
Sparkup

您可以使用 linq :) 使用:

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

b
bluish
people.OrderBy(person => person.lastname).ToList();

好吧,这仍然没有捕捉到结果 - 你需要一个“List people =”在左侧......
这个答案说明了使用 LINQ 时最常见的错误 - 像 OrderBy 修改列表,而是返回需要分配给某些东西的新“集合”(通常是惰性 IEnumerable<T>)。
@AlexeiLevenkov 你怎么知道这是使用 LINQ 时最常见的错误?
b
bluish
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();
        }
    }
}

I
Iman

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

列表.排序()

List.Sort(通用比较)

List.Sort(通用 IComparer)

List.Sort (Int32, Int32, Generic IComparer)


Sort() 非常有用,尤其是当它是 List()
j
jalgames

您可以使用此代码段:

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

其中 New1List<Employee>

EmpListList<Employee> 的变量。

zEmployee 类型的变量。


AnshuMan,没有什么像 var 类型的。 New1List<Employee>zEmployee
r
rosselder83

你也可以使用

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

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

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

dvm.PagePermissions 是我的 ViewModel 上的 List T 类型的一个属性,在这种情况下,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 的要求来说太复杂了。不过,对于不同的问题,这是一个很好的解决方案。