区分顺序列表 LINQ

Posted

技术标签:

【中文标题】区分顺序列表 LINQ【英文标题】:Distinct and order list LINQ 【发布时间】:2014-04-11 01:14:57 【问题描述】:

使用实体框架,我有以下代码返回一个列表:

    private List<string> MyList()
    
        using (MyEntities ctx = new MyEntities())
        
            var myList= from a in ctx.Foo
                        orderby a.Bar
                        select a.Bar;

            return myList.ToList();
        
    

这很好用,但我想要一个不同的列表。为此,我尝试了以下代码,将 .Distinct() 添加到选择中:

    private List<string> MyList()
    
        using (MyEntities ctx = new MyEntities())
        
            var myList= from a in ctx.Foo
                        orderby a.Bar
                        select a.Bar.Distinct();

            return myList.ToList();
        
    

很遗憾,这个新代码会导致错误:

无法将类型“System.Collections.Generic.List(System.Collections.Generic.IEnumberable(char))”隐式转换为“System.Collections.Generic.List(string)”

然后我尝试了这段代码,它确实给了我一个不同的列表,但现在看来 orderby 不起作用,因为结果未排序:

    private List<string> MyList()
    
        using (MyEntities ctx = new MyEntities())
        
            var myList= (from a in ctx.Foo
                        orderby a.Bar
                        select a.Bar).Distinct();

            return myList.ToList();
        
    

有什么想法可以返回一个不同的 AND 排序列表吗?

【问题讨论】:

【参考方案1】:

试试这个

private List<string> MyList()

    using (MyEntities ctx = new MyEntities())
    
        var myList= ctx.Foo.Select(a => a.Bar).Distinct().OrderBy(a => a);

        return myList.ToList();
    

【讨论】:

【参考方案2】:

一种有效的方法是使用 groupby

private List<string> MyList()

    using (MyEntities ctx = new MyEntities())
        return ctx.Foo.GroupBy(a => a.Bar).Select(g => g.Key).OrderBy(a => a).ToList();

你可以像这样在 linqpad 中测试它:

void Main()

    var Foo = Enumerable.Range(0,50).Select(i => new  id = i, Bar = i%3).ToList();
    var myList= Foo.GroupBy(a => a.Bar).Select(g => g.Key).OrderBy(a => a).ToList();
    Console.WriteLine(myList);

【讨论】:

以上是关于区分顺序列表 LINQ的主要内容,如果未能解决你的问题,请参考以下文章

C# LINQ 组按属性集合,然后按列表定义的显式顺序对每个组进行排序[重复]

根据子列表中的第二个元素按字母顺序对列表进行排序,但不区分大小写[重复]

使用 LINQ 获取列表中的所有对

使用 LINQ 获取列表中的所有对

使用 Linq 按名称频率对列表进行排序

Linq 首先按特定数字排序,然后按顺序显示所有其余部分