Вернуть X результатов из Linq To Objects Query в порядке - PullRequest
1 голос
/ 09 июля 2010

ПРЕДЫДУЩАЯ: В этом вопросе кто-то сказал мне, как использовать CompareTo для возврата фамилий в пределах определенного диапазона, упорядоченного в алфавитном порядке с помощью LINQ to Objects.

Остальная часть моего вопроса, который, кажется, пропустил первоначальный вопрос о безумном кормлении, фактически возникла после того, как я проверил это решение. В предыдущем примере у меня был список имен:

Adams
Bentham
Bickford
Gillies
Kelly
Moore
Peters
Rutherford
Smith
Taylor
Williams

И я хотел иметь возможность запросить их, например, для всех имен между Джиллис и Мур и получить:

Gillies
Kelly
Moore

Это все хорошо, если вы хотите, чтобы каждое отдельное имя в промежутке между стойками ворот возвращалось, несмотря ни на что. Проблема возникает, когда у вас огромное количество фамилий, и вы хотите, чтобы максимум четыре из имен между Джиллис и Тейлор возвращались в алфавитном порядке, например.

Итак, желаемый результат:

Gillies
Kelly
Moore
Peters

Однако, только возвращение четырех результатов между Джиллис и Тейлором может вернуть Келли, Питера, Смита и Тейлора или Джиллис, Мура, Резерфорда и Смита. По сути, запрос берет ваше слово и просто выбирает любую старую четверку между стойками ворот.

Итак, как я могу получить 4 лучших результата в алфавитном порядке. Конечно, я мог бы написать второй запрос и вернуть подмножество, а затем выбрать из него ... но не должно ли быть способ интегрировать это поведение в исходный запрос?

Я пробовал несколько вещей с OrderBy, и пока они просто не работают. Так что все кончено, ребята.

РЕДАКТИРОВАТЬ: для тех двоих из вас, кто предложил использовать "взять", я уже использую принять. Это не «принимает» по порядку, даже если вы используете 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 ]

5 голосов
/ 09 июля 2010

Из ваших правок видно, что вы делаете заказ в порядке, отличном в странном порядке:

Это работает для меня (где "allMyNames" - это просто список ).

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

Я намного счастливее, используя форму расширения LINQ:)

4 голосов
/ 09 июля 2010

Используйте метод LINQ "Take", чтобы взять первые 4 записи:

var query = (from name in originalList
    where name.CompareTo(fromName) >= 0 && name.CompareTo(toName) <= 0
    orderby name
    select name).Take(4);
2 голосов
/ 09 июля 2010
GetNames(...).Take(4);

Возьму первые четыре предмета из перечисляемого.

...