我有一个包含 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
以很小的成本完成。当您执行 Insert
或 Remove
时,它会在内部调用 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/