C# 实现自定义剪贴板的最佳方式/数据结构是什么?

C# 实现自定义剪贴板的最佳方式/数据结构是什么?,c#,data-structures,queue,unity3d,clipboard,C#,Data Structures,Queue,Unity3d,Clipboard,我在Unity3D和C#一起工作,为我的游戏开发一个非常简单的文件管理器。 您可以对文件/文件夹执行一些简单的操作,其中一个是“剪切” (可能是“复制”,供以后使用) 为了更好地想象正在发生的事情: 对于复制和粘贴,我需要一个自定义的剪贴板。我想到了两种数据结构来实现它,一个堆栈和一个队列。堆栈的问题是,如果我剪切“a”、“b”和“c”,它们将被反向粘贴,后进先出。所以我觉得排队比较好 public class Clipboard<T> { private SLLQueue

我在Unity3D和C#一起工作,为我的游戏开发一个非常简单的文件管理器。 您可以对文件/文件夹执行一些简单的操作,其中一个是“剪切” (可能是“复制”,供以后使用)

为了更好地想象正在发生的事情:

对于复制和粘贴,我需要一个自定义的
剪贴板
。我想到了两种数据结构来实现它,一个
堆栈
和一个
队列
。堆栈的问题是,如果我剪切“a”、“b”和“c”,它们将被反向粘贴,后进先出。所以我觉得排队比较好

public class Clipboard<T>
{
    private SLLQueue<T> queue; // SLL stands for SinglyLinkedList, the queue is implemented that way...

    public Clipboard()
    {
        queue = new SLLQueue<T>();
    }

    public void Add(T data)
    {
        queue.Clear();
        Append(data);
    }

    public void Add(T[] data)
    {
        queue.Clear();
        foreach (var d in data)
            Append(d);
    }

    private void Append(T data)
    {
        queue.Push(data);
    }

    public T[] Clear()
    {
        int len = queue.Count;
        var data = new T[len];
        for (int i = 0; i < len; i++)
        {
            data[i] = queue.Pop();
        }
        return data;
    }
}
公共类剪贴板
{
private SLLQueue queue;//SLL代表SinglyLinkedList,队列是这样实现的。。。
公共剪贴板()
{
队列=新的SLLQueue();
}
公共无效添加(T数据)
{
queue.Clear();
附加(数据);
}
公共无效添加(T[]数据)
{
queue.Clear();
foreach(数据中的var d)
附加(d);
}
私有void附加(T数据)
{
队列推送(数据);
}
公共T[]清除()
{
int len=queue.Count;
var数据=新的T[len];
对于(int i=0;i
这够好吗这是正确的数据结构吗?-我是否以正确的方式实现了剪贴板的操作

非常感谢你的帮助

编辑:我没有查看系统的剪贴板

编辑:我已经使用了队列实现,下面是剪贴板如何工作的

    public void CutSelection()
    {
        // if there's already something cut, change its fade/alpha back to normal
        var clipContents = fileManager.Clipboard.Clear();
        foreach (var c in clipContents)
            c.Icon.alpha = 1f;

        // adds all the currently selected items to the clip
        fileManager.Clipboard.Add(Selection);

        // cut their alpha to half
        foreach (var s in Selection)
            s.Icon.alpha = CUT_ALPHA;
    }

public void Paste()
{
     // clear the clip / get the content inside it, get their alpha back to full and move them to the current folder
    var clipContents = Clipboard.Clear();
    if (clipContents != null) {
        for (int i = 0, len = clipContents.Length; i < len; i++) {
            clipContents[i].Icon.alpha = 1;
            clipContents[i].MoveTo(currentFolder);
        }
    }
}
public void CutSelection()
{
//如果已经有东西被切割,请将其淡入度/alpha值更改回正常值
var clipContents=fileManager.Clipboard.Clear();
foreach(clipContents中的var c)
c、 Icon.alpha=1f;
//将当前选定的所有项目添加到剪辑中
fileManager.Clipboard.Add(选择);
//把他们的阿尔法减半
foreach(选择中的var s)
s、 Icon.alpha=切割α;
}
公共空白粘贴()
{
//清除剪辑/获取其中的内容,将其alpha恢复为full并将其移动到当前文件夹
var clipContents=Clipboard.Clear();
if(clipContents!=null){
for(int i=0,len=clipContents.Length;i
使用。
这里有一个添加和检索数据的方法。

几个问题:A)为什么不使用System.Collections.Generic.Queue,以及B)为什么不使用System.Windows.Forms.Clipboard?纯粹出于自定义原因。A) 我的队列是通过链表实现的,我相信集合中的队列是通过数组实现的,或者可能是通过列表实现的对于我所需要的,链表在性能和存储方面都更好。B) 因为它比我需要的多得多。同样,使用自定义内容,您可以进行更多控制。另外,我正在学习过程中,并试图让自己的每件事都更深入地了解事物的工作原理。大多数剪贴簿不是一个单一的存储区还是一个列表(不是一个队列或堆栈)?这将使寻找“最佳实践”变得非常困难。。也许是因为你提出的问题。我发现的关于堆栈或队列的唯一问题是,如果不清除堆栈/队列,你就无法方便地获取剪贴板的所有内容(我的方法是^)。有了一个列表,我可以随时得到我想要的内容。我喜欢队列/堆栈的地方在于,您只在需要时分配内存(假设堆栈/队列是通过链表实现的),而不是按2的幂分配内存的列表。1、2、4、8、16、32等额外的行李,我不要。我认为队列与我正在做的工作(单存储)配合得很好,尽管我可以很容易地更改它。我怀疑您在过早地优化。对于初学者来说,传统的链表几乎从来都不是简单、陈旧、顺序访问列表的正确解决方案。其次,没有任何迹象表明您需要这种严格控制的内存:空数组元素每个只占用8个字节;用户可以剪切和粘贴多少对象,从而使其成为一个重大问题?你对剪贴板的需求是建立在真实需求上的(尽管你会失去与其他应用程序的互动性),但我看不到任何需要自定义集合的东西(在大多数情况下是代码味道)。这不是我要问的。我知道如何使用剪贴板类。我不想处理系统的剪贴板,我只需要一个剪贴板结构。这不是OP想要的。他们希望实现基于堆栈或队列的剪贴板。内置的Clipboard类正是我在上面的评论中所说的——单存储。