如何在 C# 中使用 List 的范围?

Seb*_*ski 11 c#

使用 C# 8,我们获得了获取“子列表”的范围。

虽然这有效:

var array = new string[] { "abc", "def", "ghi" };
var subArray = array[0..1]; // works
Run Code Online (Sandbox Code Playgroud)

这不会:

var list = new List<string> { "abc", "def", "ghi" };
var subList = list[0..1]; // does not work
Run Code Online (Sandbox Code Playgroud)

如何在列表中使用范围?

CSh*_*pie 11

只是为了完整起见,我知道这并不完全是 OP 所要求的。

List<T>有一个GetRange-方法。

https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.list-1.getrange?view=net-5.0

List<?> range = list.GetRange(0,5);
Run Code Online (Sandbox Code Playgroud)

它与新的语言功能没有太大关系,但它确实做到了它所说的。

请不要ToArray仅仅为了使用那个奇特的新语言功能而使用。这是不值得的开销。


yaa*_*kov 11

列表本身不支持范围。但是,如果您只有一个 Range,您可以创建一个有用的扩展方法,如下所示:

public static class ListExtensions
{
    public static List<T> GetRange<T>(this List<T> list, Range range)
    {
        var (start, length) = range.GetOffsetAndLength(list.Count);
        return list.GetRange(start, length);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后您可以使用它来获取您的子列表:

var list = new List<string> { "abc", "def", "ghi" };
var subList = list.GetRange(0..1);
Run Code Online (Sandbox Code Playgroud)

  • 列表支持使用整数索引,但不支持使用“System.Index”或“System.Range”。 (3认同)

Ali*_*adi 5

您可以使用ToArray()方法来解决问题:

var list = new List<string> { "abc", "def", "ghi" };
var subList = list.ToArray()[0..1]; // works
Run Code Online (Sandbox Code Playgroud)

但请注意,List<T>具有GetRange做同样事情的方法:

var list = new List<string> { "abc", "def", "ghi" };
var subList = list.GetRange(0,1);//abc
Run Code Online (Sandbox Code Playgroud)