我有字符串列表,我删除每个重复项,现在我想过滤它以获得最后5条记录。我怎么能这样做?
到目前为止我得到了什么
List<string> query = otherlist.Distinct().Select(a => a).ToList();
答案 0 :(得分:10)
您不需要.Select(a => a)
。多余的。
你可以跳过其余的记录来获取最后5条记录,如
List<string> query = otherlist.Distinct().ToList();
List<string> lastFive = query.Skip(query.Count-5).ToList();
答案 1 :(得分:5)
编辑以迎合非列表输入,现在处理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];
}
}
答案 2 :(得分:4)
这个怎么样?
var lastFive = list.Reverse().Take(5).Reverse();
编辑:这是整个事情 -
var lastFiveDistinct = otherlist.Distinct()
.Reverse()
.Take(5)
.Reverse()
.ToList();
另请注意,如果您最后收到query
来电,则不应将其称为ToList()
,因为此时不再一个查询,它已经被评估并变成一个列表。如果您只需要迭代,则可以省略ToList()
来电,并将其保留为IEnumerable
。
答案 3 :(得分:0)
var count=list.Count();
var last5=list.Skip(count-5);
编辑:
我错过了数据是List&lt; T&gt; 。对于IEnumerable&lt; T&gt;
,这种方法会更好