C# 合并时列表的优先排序

C# 合并时列表的优先排序,c#,generics,sorting,C#,Generics,Sorting,我有两个相同类型对象的列表 一个列表来自系统管理员,另一个来自查看页面的用户 必须合并这些列表以便在某个点查看,并且列表排序所依据的值position可能会有冲突的值 有没有一种方法可以合并这两个列表,并且在找到相同的位置值时,将较低(因此更好)的位置分配给管理员列表 范例 class info { int position; string title; } List<info> adminInfo = new List<info> { new info(

我有两个相同类型对象的列表

一个列表来自系统管理员,另一个来自查看页面的用户

必须合并这些列表以便在某个点查看,并且列表排序所依据的值
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"
类信息
{
内部位置;
字符串标题;
}
列表管理员信息=新列表
{
新信息(){position=0,title=“adminOne”}
新信息(){position=4,title=“adminThree”}
新信息(){position=3,title=“adminTwo”}
}
List userInfo=新列表
{
new info(){position=0,title=“userOne”}
new info(){position=3,title=“userTwo”}
}
列表优先排序列表(列表管理员列表、列表用户列表)
{
//这里有些魔力
}
//通过优先排序列表循环并显示
//每个项目的标题应返回以下内容:
“adminOne”
“用户一号”
“二号管理员”
“用户二”
“三个”

如果每个
信息只出现在其中一个列表中,您可以不使用匿名对象。联合列表,按
位置
排序,然后按
adminList
中是否包含元素排序:

List<info> PreferentiallySortedList(List<info> adminList, List<info> userList)
{
    return adminList.Union(userList)
                    .OrderBy(u => u.position)
                    .ThenBy(u => !adminList.Contains(u))
                    .ToList();
}
列表优先排序列表(列表管理员列表、列表用户列表)
{
返回adminList.Union(userList)
.OrderBy(u=>u.position)
.ThenBy(u=>!adminList.Contains(u))
.ToList();
}
根据列表的大小,可能需要考虑性能。

最简单的方法(代码方面)是将LINQ与联合一起使用,并创建一个包含优先级和
信息的新匿名类

类似这样的内容(可能有语法错误)


当职位相同时,这不会在用户信息之前排序admin。给出上面的示例,是的,标题按字母顺序排列,这会起作用。如果不是这样的话,我认为这不会继续起作用。如果用户列表的标题为“ABC”,管理员列表的标题为“DEF”,位置值相同,这不会给出错误的顺序吗?我明白了,所以我需要在类中添加第二个标志,将所有管理员对象标记为0,然后将所有用户对象标记为1,如果我执行orderby位置,然后按优先顺序正确排列。是的,你的理解是正确的。但是我使用一个匿名者来进行排序,这样您就不必修改现有的info类。将我的代码粘贴到
某种魔法中
,一切都应该是甜蜜的。顺便说一句,C#约定是大写的驼峰类、方法和属性名称,因此
类信息
应该是
类信息
@RichardSchneider
。SortBy(u=>u.info.position)
可能是'OrderBy'?@KonstantinVasilcov谢谢。我用的是智能手机,从过去10年一直无法使用的内存开始,我必须做所有的事情。
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();