【问题标题】:.NET equivalent of Java's List.subList()?.NET 等效于 Java 的 List.subList()?
【发布时间】:2010-11-20 05:10:42
【问题描述】:

是否有适用于 IList<T> 的 Java 的 List.subList() 的 .NET 等效项?

【问题讨论】:

    标签: java .net list collections sublist


    【解决方案1】:

    使用 LINQ

    list.Skip(fromRange).Take(toRange - fromRange)
    

    【讨论】:

    • 这是返回原始列表的视图还是范围的副本?
    • 在 IList 上工作,而不仅仅是在 List 上,这就是我要找的。​​span>
    • @Joachim Sauer:这是一个查询,它的结果取决于它的评估方式。在评估时,它会循环应用一些规则的列表元素。这不是 Java 的 subList 函数的直接模拟,在这种情况下比较它们是错误的。
    • @Kamarey:很公平,但是解决方案应该有一个免责声明。一般来说,似乎有一些方法可以实现您想要的,但是对于 subList() 没有单一的 1:1 匹配(这不是问题,但应该注意)。
    【解决方案2】:

    对于通用的List<T>,它是GetRange(int, int) 方法。

    编辑:请注意,这是一个浅拷贝,而不是原件的“视图”。我不认为 C# 提供了确切的功能。

    Edit2:正如 Kamarey 指出的那样,您可以拥有只读视图:

    List<int> integers = new List<int>() { 5, 6, 7, 8, 9, 10, 11, 12 };
    IEnumerable<int> view = integers.Skip(2).Take(3);
    integers[3] = 42;
    
    foreach (int i in view )
      // output
    

    上面将打印 7、42、9。

    【讨论】:

    • 从 MSDN 文档 (msdn.microsoft.com/en-us/library/21k0e39c.aspx) 看来并不相同:GetRange() 返回浅拷贝,而 subList() 返回视图(即更改 subList()将反映在原始列表中!)
    • 好吧,你是对的。不确定这是否是确切的要求,但我会编辑我的答案以反映这一点。
    【解决方案3】:

    GetRange 是你的答案

    【讨论】:

    • 再次声明:这不是完全相同的东西,因为它返回的是浅拷贝而不是视图。返回一个视图可以实现一些非常漂亮的技巧(例如,它不需要提供 RemoveRange() 方法,因为它可以很容易地写成 list.subList(x,y).clear())。
    • 我必须诚实地说,我并没有真正看到好处。此外,removeRange() 和 subList.clear() 听起来不是一回事,因为清除不应该与删除范围相同。但是哦,好吧:-)
    • 一旦你理解 subList() 将视图返回到原始列表(而不是副本)的概念,很明显 someList.subList(1,3).clear()将从原始列表中删除对象。最重要的部分不是它是否更好,而是 subList() 和 GetRange() 不做同样的事情,所以它们不应该被视为等效(至少不是没有免责声明)。跨度>
    • IList 是否有等效的扩展方法?
    • 啊,当然,clear() 也会删除内容。我以为它将其内容设置为 null 或默认值之类的。
    猜你喜欢
    • 2011-03-23
    • 2012-11-28
    • 2019-04-15
    • 2011-01-27
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    相关资源
    最近更新 更多