0

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

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

在某些时候必须合并这些列表以便查看,并且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"
4

2 回答 2

1

最简单的方法(代码方面)是将 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();
于 2013-01-17T06:49:35.793 回答
0

如果每个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();
}

根据列表的大小,可能需要考虑性能。

于 2013-01-17T06:39:49.057 回答