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

ber*_*ert 1 c# linq-to-objects

以前:在这个问题中,有人告诉我如何使用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

然而,仅仅返回Gillies和Taylor之间的四个结果可能会让Kelly,Peters,Smith和Taylor,或Gillies,Moore,Rutherford和Smith再次回归.基本上,查询会引导您完成单词,并且只选择球门柱之间的任何旧四.

那么,我如何按字母顺序获得前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);
Run Code Online (Sandbox Code Playgroud)

这只会从您选择的名称之间返回四个名称,而不是特定的四个名称.

ann*_*ata 5

从您的编辑看起来,您正在按顺序执行orderby和distinct:

这适用于我(其中"allMyNames"只是一个List <string>).

   var ofInterest = allMyNames
                    .Distinct()
                    .Where(x => x.CompareTo(from) >= 0 && x.CompareTo(to) <= 0)
                    .OrderBy(x => x)
                    .Take(4);
Run Code Online (Sandbox Code Playgroud)

我更高兴使用LINQ的扩展形式:)