【问题标题】:OrderBy specific elements in ListOrderBy List 中的特定元素
【发布时间】:2012-10-10 14:48:49
【问题描述】:

我的场景是:我有一个使用 linq 的名为 MenuBO 的类,它有一个名为 SelectAll() 的函数,它返回一个对象列表 menu 用作 DataSourceDropDownList。在返回之前,我需要在列表中插入一个新项目作为DropDownList的默认值

到目前为止,这是我尝试过的:

public List<menu> SelectAll()
{
    using (var db = new SeloQual_AdminEntities(conn))
    {
        menu vmenu = new menu();
        vmenu.cod_menu = 0;
        vmenu.cod_menu_pai = null;
        vmenu.des_menu = "Select...";
        var query = from p in db.menu orderby p.des_menu select p;
        var test = query.ToList();
        test.Add(vmenu);
        return test.OrderBy(x => x.cod_menu).ToList();
    }
}

OrderBy(x =&gt; x.cod_menu) 可以做到这一点,vmenu 项目像我想要的那样显示在顶部,但我需要其他项目由 des_menu 订购。我尝试了类似的东西

return teste.OrderBy(x => x.cod_menu).ThenBy(y => y.des_menu).ToList();

但当然没有用,所以我需要一些帮助才能仅对第一个元素之后的元素进行排序

【问题讨论】:

    标签: asp.net linq list


    【解决方案1】:

    我认为您真正想要的是以下代码:

    menu vmenu = new menu();
    vmenu.cod_menu = 0;
    vmenu.cod_menu_pai = null;
    vmenu.des_menu = "Select...";
    var query = from p in db.menu orderby p.des_menu select p;
    
    List<menu> result = new List<menu>();
    result.Add(vmenu);
    result.AddRange(query);
    return result;
    

    这可以优雅地解决您的问题,只需先添加默认菜单项,然后按照查询中定义的顺序添加已经排序的菜单项。

    【讨论】:

    • 另一种可能的方式,如果您想避免强制建立列表:return new[] { vmenu }.Concat(query).ToList();
    • @cdhowie:我觉得这很不可读,如果可能的话尽量避免。
    • 并不是说这是 OP 应该走的路,只是指出它作为替代方案。
    • 谢谢,但由于列表中不会有很多内容,我将寻求 Raphaël Althaus 的解决方案,但无论如何谢谢
    • 但你的答案是最好的,所以我会选择它
    【解决方案2】:

    您可以只使用 Insert 而不是 Add

    var vmenu = new menu{
        cod_menu = 0,
        des_menu="Select..."
        };
    List<menu>res = db.menu.OrderBy(p => p.des_menu).ToList();
    res.Insert(0,vmenu);
    return res;
    

    【讨论】:

    • 一种有效的技术,但引入了不必要的性能问题;如果结果集相当大,这会将结果放入列表中,然后将所有列表元素向下移动一个。 (好吧,无论如何它都会这样做,但如果结果集很大,它可能会成为瓶颈。)
    • 谢谢,它成功了,认为使用Insert 会替换列表的位置 0 而不是向上移动,谢谢!
    • @cdhowie 我同意(不确定这是否会成为性能瓶颈,但是是的,Daniel 的答案更好)。
    • 因为东西不多,我觉得不会有问题
    猜你喜欢
    • 2022-11-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-09
    • 2012-04-08
    • 1970-01-01
    • 2010-10-15
    • 2011-07-13
    • 1970-01-01
    相关资源
    最近更新 更多