2010-07-09 38 views
1

以前:在this question有人告诉我如何使用CompareTo返回按照字母顺序使用LINQ to Objects命令的特定范围内的姓氏。返回从Linq到Top对象的Top X结果按顺序查询

我的问题的其余部分,似乎已经错过了最初的问题,要求喂狂热,实际上是在我测试这个解决方案后出现的。在前面的eaxample我有名字的列表:

 
Adams 
Bentham 
Bickford 
Gillies 
Kelly 
Moore 
Peters 
Rutherford 
Smith 
Taylor 
Williams 

,我想能够查询他们对所有吉利斯和摩尔的名字,例如并获得:

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

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

回答

5

从您的编辑,它看​​起来像你这样做在一个陌生的顺序排序依据和独特的:

该作品对我来说(其中“allMyNames”只是一个列表<字符串>)。

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

我更快乐使用LINQ :)

+0

最终的延伸形式,我投降了,并写了一个复杂的LINQ语句来选择这种格式列表中,英文缩写和姓氏,然后第二个查询执行采取要求。仍然会很高兴从一个查询返回id列表*耸耸肩* – bert 2010-07-12 10:55:13

2
GetNames(...).Take(4); 

将采取可枚举的前四项。

4

使用“以” LINQ法取前4个记录:

var query = (from name in originalList 
    where name.CompareTo(fromName) >= 0 && name.CompareTo(toName) <= 0 
    orderby name 
    select name).Take(4);