Как получить последние x записей из списка с помощью Lambda - PullRequest
8 голосов
/ 08 июля 2010

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

Что я получил до сих пор

 List<string> query = otherlist.Distinct().Select(a => a).ToList();

Ответы [ 4 ]

10 голосов
/ 08 июля 2010

Вам не нужно .Select(a => a). Это избыточно.

Вы можете получить последние 5 записей, пропустив остальные как

List<string> query = otherlist.Distinct().ToList();
List<string> lastFive = query.Skip(query.Count-5).ToList();
5 голосов
/ 08 июля 2010

редактировать для обслуживания входов, не включенных в список, теперь обрабатывает IEnumerable<T> и проверки , если это IList<T>; в противном случае он буферизует его через ToList(), что помогает гарантировать, что мы читаем данные только один раз (вместо .Count() и .Skip(), которые могут читать данные несколько раз).

Поскольку это список, я был бы склонен написать метод расширения, который использует его в полной мере:

    public static IEnumerable<T> TakeLast<T>(
           this IEnumerable<T> source, int count)
    {
        IList<T> list = (source as IList<T>) ?? source.ToList();
        count = Math.Min(count, list.Count);
        for (int i = list.Count - count; i < list.Count; i++)
        {
            yield return list[i];
        }
    }
4 голосов
/ 08 июля 2010

Как насчет этого?

var lastFive = list.Reverse().Take(5).Reverse();

edit: вот и все -

var lastFiveDistinct = otherlist.Distinct()
                                .Reverse()
                                .Take(5)
                                .Reverse()
                                .ToList();

Также обратите внимание, что вам не следует называть его query, если в конце вы получили вызов ToList(), потому что тогда это не запрос, он был оценен и превращен в список. Если вам нужно только перебрать его, вы можете опустить вызов ToList() и оставить его как IEnumerable.

0 голосов
/ 08 июля 2010
var count=list.Count();
var last5=list.Skip(count-5);

РЕДАКТИРОВАТЬ:

Я пропустил, что данные списка .Этот подход был бы лучше для IEnumerable

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...