如何使用Lambda从列表中获取最后的x条记录

时间:2010-07-08 09:07:26

标签: c# lambda c#-4.0

我有字符串列表,我删除每个重复项,现在我想过滤它以获得最后5条记录。我怎么能这样做?

到目前为止我得到了什么

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

4 个答案:

答案 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;

,这种方法会更好