使用LINQ对列表进行去重和排序

3
使用 Entity Framework,我有以下代码返回一个列表:
    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)”

然后我尝试了此代码,它确实给了我一个清晰的列表,但现在似乎排序不起作用了,因为结果是未排序的:

    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();
        }
    }

有什么方法可以返回一个不重复且排序过的列表吗?

2个回答

5

试一下这个

private List<string> MyList()
{
    using (MyEntities ctx = new MyEntities())
    {
        var myList= ctx.Foo.Select(a => a.Bar).Distinct().OrderBy(a => a);

        return myList.ToList();
    }
}

1

一个高效的方法是使用 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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接