使阵列像圆一样工作

本文关键字:一样 工作 阵列 | 更新日期: 2023-09-27 18:22:23

我不太确定如何做到这一点。

伪代码:

array1 = {"a","b", "c", "d", "e","f", "g","h", "i","j"} //there might be more values.
take c
loop =>c+3 =f
       f+3 =i
       i+3 =b
       b+3 =e
......
end loop

我需要将这个array1作为一个,并找到添加3(f、I、b、e等)的字母。

使阵列像圆一样工作

使用mod(%),则index可以是任何正值,并且它将环绕:

int index;
array1[index % array1.Length]

您需要自己编写"查找添加3的字母"函数,如:

new_index = (current_index+3)%length_of_array

正如其他答案所说,%运算符是实现它的关键。

private string[] strings = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j" };
private IEnumerable<string> GetStringWrapped(int position)
{
    int current = position - 1;
    while (true)
    {
        yield return strings[current];
        current += position;
        current %= strings.Length;
    }
}

将其用作

void SomeMethod()
{
    var resultArray = GetStringWrapped(3).Take(5).ToArray();
    //resultArray contains c,f,i,b,e
}

注意Take很重要,否则您的方法将永远不会结束,它将永远循环。

我们可以使用%运算符来计算数组中的循环索引,然后我们可以将其抽象到类中

class CircularList<T> : List<T>
        {
            public new T this[int index]
            {
                get { return base[index%Count]; }
                set { base[index%Count] = value; }
            }
            public T this[T item, int distance]
            {
                get
                {
                    var index = IndexOf(item);
                    return this[index + distance];
                }
                set
                {
                    var index = IndexOf(item);
                    this[index + distance] = value;
                }
            }
        }

用法:

    var arr = new CircularList<string> { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j" };
    var b = arr[8 + 2];
    var b2 = arr["i", 2];