区分顺序列表 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 组按属性集合,然后按列表定义的显式顺序对每个组进行排序[重复]