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

标签 c# list visual-studio

我有一个包含 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/

相关文章:

c# - 在 .ASPX 文件中使用 Eval()

c# - 在 C# 中递归地从列表中删除

c# - 何时使用 DebuggerDisplayAttribute

javascript - 单击时使用 jquery 清除列表

python - 将 [key1,val1,key2,val2] 转换为字典?

visual-studio - 设置 Visual SVN 以供实际使用

javascript - 每天更新网站变量

c# - 为什么这是进食内存?

c# - 更新数据表中的值不起作用

python - 从列表列表中删除列表 Python