在生成最小 字符串长度的字符串中,使用最快的解析回算法存储点类型列表的最快方法是什么?
我发现框架有 Convert.ToBase64String、Convert.FromBase64String 方法。对使用这些甚至更好的自行设计算法的任何想法持开放态度;)
提前致谢
C#, vs2005 (.net 2.0)
-编辑-
我将在 activeX 组件中使用代码,我不能为此目的添加另一个库。
最佳答案
使用整数的十六进制表示,它减少了字符串的大小:
序列化:
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)));
}
或者您可以使用正则表达式来解析组(“[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));
}
}
恕我直言。
已编辑:或者更好地将整数打包为十六进制组:1212 到“CC”,就像在旧金融系统中使用的那样;它使字符串的长度减少两倍。
关于c# - 将 List<Point> 存储在字符串中并解析回来的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4023436/