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)
这只会从您选择的名称之间返回四个名称,而不是特定的四个名称.
从您的编辑看起来,您正在按顺序执行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的扩展形式:)