【问题标题】:What is the best way/data structure to implement a custom Clipboard?实现自定义剪贴板的最佳方式/数据结构是什么?
【发布时间】:2013-09-03 04:35:14
【问题描述】:

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

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

对于复制和粘贴,我需要一个自定义的Clipboard。我想到了两个数据结构来实现它,StackQueue。堆栈的问题在于,如果我剪切“a”、“b”和“c”,它们将被反向粘贴,LIFO。所以我认为队列更好。

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;
    }
}

这够好吗? - 这是正确的数据结构吗? - 我是否以正确的方式实现了剪贴板的操作?

非常感谢您的帮助。

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

编辑:我使用了队列实现,下面是剪贴板的实际工作方式。

    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);
        }
    }
}

【问题讨论】:

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

标签: c# data-structures queue unity3d clipboard


【解决方案1】:

使用Clipboard Class。 这是一个example,用于添加和检索数据。

【讨论】:

  • 这不是我要问的。我知道如何使用剪贴板类。我不想处理系统的剪贴板,我只需要一个剪贴板结构。
  • 这不是 OP 想要的。他们想要实现基于堆栈或队列的剪贴板。内置的剪贴板类与我在上面的评论中所说的完全一样 - 单一存储。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-17
  • 1970-01-01
  • 2016-01-30
  • 1970-01-01
  • 1970-01-01
  • 2015-11-15
相关资源
最近更新 更多