返回从Linq到对象查询的前X个结果

时间:2010-07-09 09:36:20

标签: c# linq-to-objects

上一篇:在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);

只返回您选择的名称之间的四个名称,而不是特定的四个名称。

3 个答案:

答案 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);

将获取可枚举中的前四项。