在一个产生最小字符串长度和最快的解析算法的字符串中存储List类型Point的最快方法是什么?
我发现该框架有Convert.ToBase64String,Convert.FromBase64String方法。使用这些甚至更好的自行设计算法开放任何想法;)
提前致谢
C#,vs2005(.net 2.0)
- 编辑 -
我将在activeX组件中使用代码,但我无法为此目的添加另一个库。
答案 0 :(得分:3)
使用整数的十六进制表示,它减少了字符串的大小:
序列化:
List<Point> list = new List<Point>(new Point[] {new Point(1, 2), new Point(10, 20), new Point (100, 200), new Point(1000, 2000), new Point(10000, 20000)});
// 1. To.
StringBuilder sb = new StringBuilder();
foreach (Point point in list)
{
sb.Append(Convert.ToString(point.X, 16));sb.Append('.');
sb.Append(Convert.ToString(point.Y, 16));sb.Append(':');
}
string serialized = sb.ToString();
以下是表格中的字符串:“x.y:1.2:a.14:64.c8:3e8.7d0:2710.4e20:”
反序列化,拆分('serialized'是包含数字链的字符串):
string[] groups = serialized.Split(new char[] {':'}, StringSplitOptions.RemoveEmptyEntries);
foreach (string group in groups)
{
string[] coords = group.Split('.');
restored.Add(new Point(Convert.ToInt32(coords[0], 16), Convert.ToInt32(coords[1], 16)));
}
或者你可以用regexp解析组(“[0-9a-fA-F]。[0-9a-fA-F]”),这取决于你。我不确定哪个更快。
或简单的状态机(只是为了好玩):
List<Point> restored = new List<Point>();
string value = default(string);
int left = 0;
int x = 0, y = 0;
for (int i = 0; i < serialized.Length; i++)
{
if (serialized[i] == '.')
{
value = serialized.Substring(left, i - left);
left = i + 1;
x = Convert.ToInt32(value, 16);
}
else if (serialized[i] == ':')
{
value = serialized.Substring(left, i - left);
left = i + 1;
y = Convert.ToInt32(value, 16);
restored.Add(new Point(x, y));
}
}
IMHO。
编辑:或者甚至更好地将整数打包到十六进制组:1212到'CC',就像它在旧的金融系统中使用一样;它使字符串的长度减少了两倍。
答案 1 :(得分:2)
To String:
MYSTRING = string.Join("", list.Select(
point => point.x.toString("X").PadLeft(4, '0') +
point.y.toString("X").PadLeft(4, '0')).toArray() )
来自字符串:
new Regex("(.{8})").Split(MYSTRING).Where(x => !string.IsNullOrEmpty(x)).
Select(x=> new Point(x.Take(4), x.Skip(4).Take(4)))
答案 2 :(得分:1)
如何使用JSON?
答案 3 :(得分:1)
只需使用ProtoBuf.Net。
答案 4 :(得分:1)
说实话,几乎不可能以权威的方式回答这个问题。很大程度上取决于点列表的大小,是否真的需要成为字符串,以及您尝试优化的方面。例如,如果您需要原始速度,您可以交易RAM以获得处理时间,但如果您需要吞吐量,则需要使用不会占用太多资源的算法。
存储任何列表并在以后恢复列表的最紧凑和最快捷的方法是使用二进制序列化。当然,这会让您面临CLR更改可能导致文件无法使用的风险。对于任何感兴趣的人来说, xml 序列化在速度和空间融合方面既不高效,但其他CLR可以读取格式而无需更改。
Base64算法非常有效,并且使用非常快速的代码表查找算法。 Base64编码二进制格式可能会产生非常好的结果。但是如果你不需要将它存储为字符串,为什么要经历额外的麻烦呢?
CORBA还定义了二进制到字符串算法,该算法必须对其尝试的事物类型有效。如果我没记错的话,它使用128符号代码表(即128位编码),因此它比基本64更紧凑。
最后,你将不得不进行一些测试。在开始测试之前,您必须知道算法何时足够好。字符串大小在可接受之前必须有多小?解析算法在可接受之前必须有多快。您需要同时解析多少这些?只有你可以确定。