.net 在C#中对具有两个项目的列表进行排序并转换为大写的错误结果

oxosxuxt  于 2023-01-14  发布在  .NET
关注(0)|答案(2)|浏览(101)

我有一个名为person的类,其中包含id and name。我有一个person的列表。我想sort the list by Id。然后,排序与same ID by name和转换的name to uppercase letters,最后,重复的项目被删除。

List<person> list = new List<person>();
list.Add(new person(112, "Bname"));
list.Add(new person(111, "Cname"));
list.Add(new person(112, "Aname"));
list.Add(new person(111, "Aname"));
list.Add(new person(114, "Aname"));

期望输出:

111,ANAME
111,CNAME
112,ANAME
112,BNAME
114,ANAME

我的代码:

for (int i = 0; i < list.Count - 1; i++)
        {

            if (list[i + 1].Id < list[i + 1].Id && string.Compare(list[i + 1].Name, list[i + 1].Name) > 0)
            { 
                person temp = list[i];
                list[i] = list[i + 1];
                list[i + 1] = temp;
                i = -1; //sort from lowest out of order index
            }
        }

        for (int i = 0; i < list.Count - 1; i++)
        {
            list[i].Name= list[i].Name.ToUpper();
            if (list[i] == list[i + 1])
                list.Remove(list[i + 1]);
        }

但是结果是错的,谁能帮帮我?

efzxgjgh

efzxgjgh1#

您可以使用linq轻松地完成所有这些操作。
1-使用OrderBy(x => x.Id对ID为的列表排序
2-使用ThenBy(x=>x.Name)按名称对具有相同ID的对象进行排序
3-使用。选择(x=〉new {Id=x.Id,Name= x.Name.ToUpper()})将名称转换为大写
4-使用.Distinct()删除重复项

var result=list.OrderBy(x => x.Id).ThenBy(x=>x.Name)
                 .Select(x=>new {Id=x.Id,Name= x.Name.ToUpper()}).Distinct().ToList();
scyqe7ek

scyqe7ek2#

首先重写person类的Equals,以比较两个对象,如

public override bool Equals(object? obj)
    {
        return Id == (obj as person)?.Id && Name == (obj as person)?.Name;
    }

则可以使用linq命名空间

list = list.OrderBy(x => x.Id).ThenBy(x => x.Name).ToList();
list.ForEach(x => x.Name = x.Name.ToUpper());
list = list.Distinct().ToList();

相关问题