很抱歉有关列表的基本问题,但我们是否在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#中完成此操作?
哦,还有最后一个问题:我可以使用什么标签(这里)将我帖子的某些部分标记为代码?
答案 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"