我正在使用 C# 在 Unity3D 中工作,并为我的游戏开发一个非常简单的文件管理器。您可以对文件/文件夹执行一些简单的操作,其中之一是“剪切”(以后可能还有“复制”)
为了更好地想象正在发生的事情:
对于复制和粘贴,我需要一个自定义Clipboard
. 我想到了两个数据结构来实现它, aStack
和 a 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);
}
}
}