如何将现有的项推到列表的末尾
本文关键字:列表 | 更新日期: 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
方法来找到总项目的索引(如果有的话),并使用RemoveAt
和Add
方法将项目移到最后:
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
放在哪里并不重要(想想一个共享列表)。这取决于我们如何使用查询,而不是在哪里注入对象