gpt4 book ai didi

c# - 在 C# 中无限旋转列表中的 3 个项目的最佳方法是什么

转载 作者:行者123 更新时间:2023-12-05 09:35:37 25 4
gpt4 key购买 nike

我有一个包含 3 个成员的列表,我想根据命令轮换他们。我创建了一个方法:

        public bool Rotate()
{
string a = this.doer[0];
string b = this.doer[1];
string c = this.doer[2];
this.doer.Clear();
this.doer.Add(c);
this.doer.Add(a);
this.doer.Add(b);
return true;
}

有没有更好更高效的方法呢?

最佳答案

理想情况下,这将通过一个链表来实现,优点是只有节点引用被断开并且不需要内部复制。 C# Queue 实际上是基于一个链表,所以这是一个相当合适的数据结构。

不过,这也可以用 List 以很小的成本完成。当您执行 InsertRemove 时,它会在内部调用 Array.Copy,尽管它仍然是 O(n) ,只要它没有通过容量检查,就没有分配并且非常高效和优化。

示例扩展

public static void RotateDown<T>(this IList<T> source)
{
// ideally you would remove first to save a potential capacity expansion
source.Add(source[0]);
source.RemoveAt(0);
}
public static void RotateUp<T>(this IList<T> source)
{
// ideally you would remove first to save a potential capacity expansion
source.Insert(0,source[^1]);
source.RemoveAt(source.Count-1);
}

测试

var list = new List<int>() {1, 2, 3, 4, 5};

Console.WriteLine(string.Join(", ",list));
list.RotateUp();
Console.WriteLine(string.Join(", ", list));
list.RotateUp();
Console.WriteLine(string.Join(", ", list));
list.RotateDown();
Console.WriteLine(string.Join(", ", list));
list.RotateDown();
Console.WriteLine(string.Join(", ", list));

输出

1, 2, 3, 4, 5
5, 1, 2, 3, 4
4, 5, 1, 2, 3
5, 1, 2, 3, 4
1, 2, 3, 4, 5

注意:方法缺少任何范围检查。同样理想情况下,这将针对较少派生的接口(interface),尽管这只是一个示例。

关于c# - 在 C# 中无限旋转列表中的 3 个项目的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65744217/

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