我想构建一个Git类,我可以在其中存储int
值(我们称它们为文件)。用filesCount
传递给类的构造函数的要存储的文件数。我需要一个void Update(int fileNumber, int value)
方法,一种int Commit()
方法,该方法可以保存文件的当前状态并返回commitNumber
(方法被称为减1的次数)。最后但并非最不重要的int Checkout(int fileNumber, int commitNumber)
几乎是不言而喻的。
我需要此类快速而有效地利用内存。我当前的解决方案对于int Checkout(int commitNumber, int fileNumber)
来说太慢了。
这是:
using System.Collections.Generic;
using System.Linq;
using System;
namespace GitTask
{
public class Git
{
int[] Files { get; set; }
Dictionary<int[], List<int>> Commits { get; set; }
int CommitsCount { get; set; }
public Git(int filesCount)
{
Files = new int[filesCount];
Commits = new Dictionary<int[], List<int>>(new MyEqualityComparer());
}
public void Update(int fileNumber, int value)
{
Files[fileNumber] = value;
}
public int Commit()
{
var temp = new int[Files.Count()];
Array.Copy(Files, temp, Files.Count());
if (Commits.ContainsKey(temp))
{
Commits[temp].Add(CommitsCount);
}
else
{
Commits[temp] = new List<int>(new int[] { CommitsCount });
}
CommitsCount++;
return CommitsCount - 1;
}
public int Checkout(int commitNumber, int fileNumber)
{
if (commitNumber >= CommitsCount)
throw new ArgumentException();
else
{
var k = Commits.FirstOrDefault(x => x.Value.BinarySearch(commitNumber) > -1).Key;
return k[fileNumber];
}
}
}
public class MyEqualityComparer : IEqualityComparer<int[]>
{
public bool Equals(int[] x, int[] y)
{
if (x.Length != y.Length)
{
return false;
}
for (int i = 0; i < x.Length; i++)
{
if (x[i] != y[i])
{
return false;
}
}
return true;
}
public int GetHashCode(int[] obj)
{
int result = 17;
for (int i = 0; i < obj.Length; i++)
{
result = result * 23 + obj[i];
}
return result;
}
}
}
我希望您能提出加速或创建这种存储文件的技巧(使用Dictionary<int[], List<int>)
可能已经快了。
对int Commit()
方法的一些解释以及使用此字典的一般目的。由于我需要存储数字,因此我决定仅在字典中存储唯一数组,并将它们用作键,并且值是List<int>
,其中包含响应该数字数组的提交数字,因此我只能存储一个唯一数组时间并有提交号。