【问题标题】:Preferential Sorting for Lists on Merge合并列表的优先排序
【发布时间】:2013-01-17 15:17:40
【问题描述】:

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

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

这些列表必须在某个时候合并才能查看,并且列表排序所依据的值 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"

【问题讨论】:

    标签: c# generics sorting


    【解决方案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();
    

    【讨论】:

    • 我明白了,所以我需要在我的类中添加第二个标志,将所有管理对象标记为 0,然后将所有用户对象标记为 1,如果我按位置进行排序,那么它应该按优先级排序正确。
    • 是的,您的理解是正确的。但是我使用匿名来进行排序,所以您 NOT 必须修改现有的信息类。将我的代码粘贴到 some kind of magic 中,一切都应该是甜蜜的。
    • 顺便说一句,C# 约定是大写的类、方法和属性名称,所以class info 应该是class Info
    • @RichardSchneider .SortBy(u =&gt; u.Info.position) 可能是“OrderBy”?
    • @KonstantinVasilcov 谢谢。我在智能手机上,必须从记忆中做所有事情,这在过去 10 年里一直失败。
    【解决方案2】:

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

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

    【讨论】:

    • 当职位相同时,这不会在用户信息之前订购管理员。
    • 鉴于上面的例子,是的,标题是按字母顺序排列的,这会起作用。如果不是这种情况,我认为这不会继续有效。
    • 如果用户列表的标题为“ABC”并且管理员列表的标题为“DEF”,对于相同的位置值,这不会给出错误的顺序吗?
    猜你喜欢
    • 2013-10-28
    • 2019-04-20
    • 2012-06-07
    • 1970-01-01
    • 2012-11-01
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多