Я имею как Список строк с тем, куда я удаляю, каждый копирует, теперь я хочу отфильтровать его еще больше для получения последних 5 записей. Как я могу сделать это?
Что я получил до сих пор
List<string> query = otherlist.Distinct().Select(a => a).ToList();
Вам не нужен .Select (a => a)
. Это избыточно.
Вы можете получить последние 5 записей, пропустив остальные, например
List<string> query = otherlist.Distinct().ToList();
List<string> lastFive = query.Skip(query.Count-5).ToList();
edit для обслуживания входных данных, не вявляющихся списками, теперь обрабатывает IEnumerable
и проверяет, если это IList
; если нет, он буферизует его через 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];
}
}
var count=list.Count();
var last5=list.Skip(count-5);
ПРАВКА:
Я пропустил, что данные List
Как насчет этого?
var lastFive = list.Reverse().Take(5).Reverse();
edit: here's the whole thing -
var lastFiveDistinct = otherlist.Distinct()
.Reverse()
.Take(5)
.Reverse()
.ToList();
Также обратите внимание, что вы не должны называть его query
, если у вас есть вызов ToList()
в конце, потому что тогда это уже не запрос, он был оценен и превращен в список. Если он нужен только для итерации, можно пропустить вызов ToList()
и оставить его как IEnumerable
.