上一篇:在this question有人告诉我如何使用CompareTo返回特定范围内的姓氏,使用LINQ to Objects按字母顺序排序。
在我测试这个解决方案之后,我的其余问题似乎已经错过了最初提出的关于喂养狂热的问题。在上一个示例中,我有一个名称列表:
Adams Bentham Bickford Gillies Kelly Moore Peters Rutherford Smith Taylor Williams
我希望能够查询Gillies和Moore之间的所有名称并得到:
Gillies Kelly Moore
如果您希望无论如何返回球门柱之间的每个单独名称,这一切都很好。当你拥有大量的姓氏并且你想要按字母顺序返回时,Gillies和Taylor之间最多有四个名字就会出现问题。
所以期望的输出是:
Gillies Kelly Moore Peters然而,只要在吉利斯和泰勒之间归来四个结果,凯利,彼得斯,史密斯和泰勒,或吉利斯,摩尔,卢瑟福和史密斯就会回归。基本上,查询会带你到你的话,只选择球门柱之间的旧四。
那么,我如何按字母顺序获得前4个结果。我当然可以编写第二个查询并返回一个子集然后从中进行选择......但是不应该有办法将这种行为集成到初始查询中吗?
我已经尝试过使用OrderBy的一些东西,到目前为止它们只是不起作用。所以它结束了你们。
编辑:对于那些建议使用“take”的人,我已经在使用take。即使您使用OrderBy,或者至少它不在我的查询中,它也不按顺序“接受”。这是:
var allIDs = (from cust in dc.orders
join item in dc.order_items on cust.orderid equals item.orderid
join del in dc.deliveries on cust.deliveryid equals del.deliveryid
join dt in dc.deliverytypes on del.deliverytype equals dt.deliverytypeid
where eventcode == item.itemcode
&& dt.description == "Secure Post"
&& (cust.status == "OK" || cust.status == "PB")
&& cust.surname.CompareTo(surfrom ?? " ") >= 0
&& cust.surname.CompareTo(surto ?? "zzz") <= 0
&& (cust.trackingcode == null ? false : (bool)cust.trackingcode)==false
orderby cust.surname, cust.initials, cust.ordercode
select cust.orderid).Distinct().Take(ordermax);
只返回您选择的名称之间的四个名称,而不是特定的四个名称。
答案 0 :(得分:5)
从您的编辑中看起来,您正在以奇怪的顺序执行orderby和distinct:
这适用于我(其中“allMyNames”只是一个List&lt; string&gt;)。
var ofInterest = allMyNames
.Distinct()
.Where(x => x.CompareTo(from) >= 0 && x.CompareTo(to) <= 0)
.OrderBy(x => x)
.Take(4);
使用LINQ的扩展形式我感到非常高兴:)
答案 1 :(得分:4)
使用“Take”LINQ方法获取前4条记录:
var query = (from name in originalList
where name.CompareTo(fromName) >= 0 && name.CompareTo(toName) <= 0
orderby name
select name).Take(4);
答案 2 :(得分:2)
GetNames(...).Take(4);
将获取可枚举中的前四项。