优先排序的列表在合并
本文关键字:合并 列表 排序 | 更新日期: 2023-09-27 17:54:15
我有两个相同类型对象的列表。
一个列表来自系统管理员,另一个列表来自查看页面的用户。
这些列表必须在某些时候合并以查看,并且列表排序的值position
很可能具有冲突的值。
是否有一种方法可以合并两个列表,并且当发现相同的值时,将较低(因此更好)的位置提供给管理列表?
例子class info
{
int position;
string title;
}
List<info> adminInfo = new List<info>
{
new info() {position = 0, title = "adminOne"}
new info() {position = 4, title = "adminThree"}
new info() {position = 3, title = "adminTwo"}
}
List<info> userInfo = new List<info>
{
new info() {position = 0, title = "userOne"}
new info() {position = 3, title = "userTwo"}
}
List<info> PreferentiallySortedList(List<info> adminList, List<info> userList)
{
//Some kind of magic here
}
//Looping through PreferentiallySortedList and displaying
//the title of each item should return the following:
"adminOne"
"userOne"
"adminTwo"
"userTwo"
"adminThree"
最简单的方法(代码方面)是使用LINQ和Union,并创建一个包含优先级和info
的新匿名类。
类似这样的内容(可能有语法错误)
return adminList
.Select(info => new {Priority = 0, Info = info})
.Union(userList.Select(info => new {Priority = 1, Info = info}))
.SortBy(u => u.Info.position)
.ThenBy(u => u.Priority)
.Select(u => u.Info)
.ToList();
如果每个info
只出现在一个列表中,您可以不使用匿名对象。联合列表,按position
排序,然后按元素是否包含在adminList
中:
List<info> PreferentiallySortedList(List<info> adminList, List<info> userList)
{
return adminList.Union(userList)
.OrderBy(u => u.position)
.ThenBy(u => !adminList.Contains(u))
.ToList();
}
根据列表的大小,可能需要考虑性能。