【发布时间】:2013-09-03 04:35:14
【问题描述】:
我正在使用 C# 在 Unity3D 中工作,并为我的游戏开发一个非常简单的文件管理器。 您可以对文件/文件夹执行一些简单的操作,其中之一是“剪切” (也许是“复制”,以后再说)
为了更好地想象正在发生的事情:
对于复制和粘贴,我需要一个自定义的Clipboard。我想到了两个数据结构来实现它,Stack 和Queue。堆栈的问题在于,如果我剪切“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