如何将现有的项推到列表的末尾

本文关键字:列表 | 更新日期: 2023-09-27 18:07:37

我有一个团队列表。团队是这样定义的:

public class Team
{
    public int ID { get; set; }
    public string Name { get; set; }
}

在我用db.Teams.ToList()查询数据库后,它返回一个List<Team>,我需要将该列表中名称为"Total"的一个团队推到列表的末尾。我怎样才能做到这一点呢?

如何将现有的项推到列表的末尾

首先,您可以直接在查询中完成:

var list = db.Teams.OrderBy(t => t.Name == "Total" ? 1 : 0).ToList();

但是如果你坚持在列表被填充之后这样做,那么你可以使用FindIndex方法来找到总项目的索引(如果有的话),并使用RemoveAtAdd方法将项目移到最后:

var list = db.Teams.ToList();
int index = list.FindIndex(t => t.Name == "Total");
if (index >= 0 && index != list.Count - 1)
{
    var total = list[index];
    list.RemoveAt(index);
    list.Add(total);
}

对于后一种情况,如果您并不真正关心列表中其他项的顺序,另一种更有效的方法是简单地将总数与最后一个元素交换:

if (index >= 0 && index != list.Count - 1)
{
    var total = list[index];
    list[index] = list[list.Count - 1];
    list[list.Count - 1] = total;
}

获取列表并将需要的列表移动到最后一个索引。注意,您不需要对列表进行排序。在这个例子中,假设你的对象是2:

List<int> list = new List<int>
{
    0,
    1,
    2,
    3,
    4
};
// get the object o(n)
int tmp = list.IndexOf(2);
// remove it
list.RemoveAt(2);
// add it to the end of list
list.Add(tmp);

简短的回答:生成哈希码

请看看@Jon Skeet的回答- https://stackoverflow.com/a/8094931/6830901

根据我的理解更简单:

在第一个循环中查找Team.Name != "Total"循环结束后,检查列表中的Team.Name == "Total"

Team放在哪里并不重要(想想一个共享列表)。这取决于我们如何使用查询,而不是在哪里注入对象