gpt4 book ai didi

c# - 为范围内的每个索引做一些事情

转载 作者:行者123 更新时间:2023-12-05 08:19:34 25 4
gpt4 key购买 nike

C# 8.0 引入了结构 System.IndexSystem.Range

遍历 System.Range 最简洁的方法是什么?

var owners = new string[] {"Alice", "Bob", "Charlie"};
var pets = new string[] {"Dog", "Cat", "Bird"};

foreach (var index in 1..3) {
var pet = pets[index];
var owner = owners[index];
Console.WriteLine($"{owner} owns a {pet}");
}

上面那行 foreach (var index in 1..3) { 是一个编译错误。

Type 'System.Range' cannot be used in 'foreach' statement because it neither implements 'IEnumerable' or 'IEnumerable', nor has suitable 'GetEnumerator' method which return type has 'Current' property and 'MoveNext' method

最佳答案

恐怕你不能枚举一个System.Range (你可以,看我的编辑)因为它没有实现 IEnumerable<int> .原因是它可能包含集合末尾的索引。

如果你想要,你需要使用 for -循环或Enumerable.Range :

foreach (var index in Enumerable.Range(0, 3)) {
var pet = pets[index];
var owner = owners[index];
Console.WriteLine($"{owner} owns a {pet}");
}

如果您只想获取同一索引处的两个集合的项目,请使用 Enumerable.Zip作为Dmitry已显示。


编辑:实际上你可以用一个扩展来做到这一点(学分here,注意我的错误修正)

public static class RangeEx
{
public static RangeEnumerator GetEnumerator(this Range range)
{
if (range.Start.IsFromEnd || range.End.IsFromEnd)
{
throw new ArgumentException(nameof(range));
}

return new RangeEnumerator(range.Start.Value, range.End.Value);
}

public struct RangeEnumerator : IEnumerator<int>
{
private readonly int _end;
private int _current;

public RangeEnumerator(int start, int end)
{
_current = start - 1; // - 1 fixes a bug in the original code
_end = end;
}

public int Current => _current;
object IEnumerator.Current => Current;

public bool MoveNext() => ++_current < _end;

public void Dispose() { }
public void Reset()
{
throw new NotImplementedException();
}
}
}

有了这个你就可以使用你的代码了:

foreach (int index in 1..3)
{
Console.WriteLine($"{owners[index]} owns a {pets[index]}");
}

关于c# - 为范围内的每个索引做一些事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70225025/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com