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

发布于 2024-09-08 07:27:40 字数 182 浏览 1 评论 0原文

我有一个字符串列表,其中我删除了每个重复项,现在我想对其进行更多过滤以获得最后 5 条记录。我该怎么做?

到目前为止我得到了什么

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

I have as List of strings with where i remove each duplicates, now I want to filter it even more to get the last 5 records. How can I do this?

What I got so far

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

无需解释 2024-09-15 07:27:40

您不需要 .Select(a => a)。那是多余的。

您可以通过跳过其余记录来获取最后 5 条记录,例如

List<string> query = otherlist.Distinct().ToList();
List<string> lastFive = query.Skip(query.Count-5).ToList();

You do not need the .Select(a => a). Thats redundant.

You can get the last 5 records, by skipping over the rest like

List<string> query = otherlist.Distinct().ToList();
List<string> lastFive = query.Skip(query.Count-5).ToList();
垂暮老矣 2024-09-15 07:27:40

编辑以满足非列表输入,现在处理 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];
        }
    }

edit to cater for non-list inputs, now handles IEnumerable<T> and checks if this is an IList<T>; if not it buffers it via ToList(), which helps ensure we only read the data once (rather than .Count() and .Skip() which may read the data multiple times).

Since this is a list, I'd be inclined to write an extension method that uses that to the full:

    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];
        }
    }
浅忆流年 2024-09-15 07:27:40

这个怎么样?

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

编辑:这就是全部内容 -

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

另请注意,如果最后有 ToList() 调用,则不应将其称为 query,因为那样它就是 不再是一个查询,它已被评估并变成一个列表。如果您只需要对其进行迭代,则可以省略 ToList() 调用并将其保留为 IEnumerable

How about this?

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

edit: here's the whole thing -

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

Also note that you shouldn't call it query if you've got a ToList() call at the end, because then it's not a query anymore, it's been evaluated and turned into a list. If you only need it to iterate over, you can omit the ToList() call and leave it as an IEnumerable.

且行且努力 2024-09-15 07:27:40
var count=list.Count();
var last5=list.Skip(count-5);

编辑:

我错过了数据是 List。这种方法对于 IEnumerable来说会更好。

var count=list.Count();
var last5=list.Skip(count-5);

EDIT:

I missed that the data is List<T> . This approach would be better for IEnumerable<T>

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文