C#中的列表是否像Python一样支持切片?

时间:2009-09-16 19:51:41

标签: c# list

很抱歉有关列表的基本问题,但我们是否在C#中使用此功能?

e.g。想象一下这个Python列表:

a = ['a','b,'c']
print a[0:1]

>>>>['a','b']

C#中有这样的东西吗?我目前有必要成对测试一些对象属性。编辑:对总是两个:P

想象一下更大的(python)列表:

a = ['a','a','b','c','d','d']

我需要测试例如if a[0] = a[1]if a[1] = a[2]等。

如何在C#中完成此操作?

哦,还有最后一个问题:我可以使用什么标签(这里)将我帖子的某些部分标记为代码?

2 个答案:

答案 0 :(得分:4)

您可以使用LINQ创建列表段的延迟评估副本。如果没有额外的代码(据我所知),你不能做任务IList<T>的“视图”。然而,没有特别的理由说明为什么这不可行。您可能希望它是固定大小(即禁止通过Add / Remove进行更改),您也可以将其设置为只读 - 基本上您只需将各种调用代理到原始清单。

听起来它可能非常有用,并且很容易编码...如果您希望我这样做,请告诉我。

出于兴趣,Python切片真的代表了一个视图,还是需要一个副本?如果稍后更改原始列表的内容,是否会更改切片的内容?如果您真的需要副本,使用Skip / Take / ToList的LINQ解决方案绝对没问题。我确实喜欢将廉价视图添加到集合中的想法......

答案 1 :(得分:0)

我一直在寻找类似Python-Slicing in C#的东西而没有运气。 我终于编写了以下字符串扩展来模仿python切片:

static class StringExtensions
{
    public static string Slice(this string input, string option)
    {
        var opts = option.Trim().Split(':').Select(s => s.Length > 0 ? (int?)int.Parse(s) : null).ToArray();
        if (opts.Length == 1)
            return input[opts[0].Value].ToString();     // only one index
        if (opts.Length == 2)
            return Slice(input, opts[0], opts[1], 1);       // start and end
        if (opts.Length == 3)
            return Slice(input, opts[0], opts[1], opts[2]);     // start, end and step
        throw new NotImplementedException();
    }
    public static string Slice(this string input, int? start, int? end, int? step)
    {
        int len = input.Length;
        if (!step.HasValue)
            step = 1;
        if (!start.HasValue)
            start = (step.Value > 0) ? 0 : len-1;
        else if (start < 0)
            start += len;
        if (!end.HasValue)
            end = (step.Value > 0) ? len : -1;
        else if (end < 0)
            end += len;
        string s = "";
        if (step < 0)
            for (int i = start.Value; i > end.Value && i >= 0; i+=step.Value)
                s += input[i];
        else 
            for (int i = start.Value; i < end.Value && i < len; i+=step.Value)
                s += input[i];
        return s;
    }
}

如何使用它的示例:

"Hello".Slice("::-1");  // returns "olleH"
"Hello".Slice("2:-1");  // returns "ll"