私は C# を使用して Unity3D で作業しており、ゲーム用の非常に単純なファイル マネージャーに取り組んでいます。ファイル/フォルダーに対して実行できる簡単な操作があります。そのうちの1つは「切り取り」です(後で「コピー」することもできます)。
何が起こっているかをよりよく想像するために:
コピーして貼り付けるには、カスタムが必要Clipboard
です。Stack
aと aで実装する 2 つのデータ構造を考えました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);
}
}
}