簡體   English   中英

儲存清單的最佳方法 <Point> 以字符串形式解析

[英]Best way to store List<Point> in a string and parse back

在產生最小字符串長度並具有最快解析算法的字符串中,存儲Point類型的List的最快方法是什么?

我發現該框架具有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(); 

這是以下形式的字符串:“ xy: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',就像在舊金融系統中使用的一樣; 它使字符串的長度減少兩倍。

要字符串:

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)))

如何使用JSON?

只需使用ProtoBuf.Net即可

老實說,幾乎不可能權威地回答這個問題。 在很大程度上取決於點列表的大小,它是否真的需要為字符串以及您要針對哪個方面進行優化。 例如,如果需要原始速度,則可以將RAM換成處理時間,但是如果需要吞吐量 ,則需要一種不會消耗太多資源的算法。

存儲任何內容並稍后恢復列表的最緊湊,最快的方法是使用二進制序列化。 當然,這使您冒着CLR更改可能使文件無法使用的風險。 對於任何感興趣的人, xml序列化都不能從速度和空間考慮方面提高效率,但是其他CLR可以讀取格式而無需更改。

Base64算法相當高效,並且使用非常快速的代碼表查找算法。 Base64編碼的二進制格式可能會產生非常好的結果。 但是,如果您不需要將其存儲為字符串,為什么還要麻煩呢?

CORBA還定義了二進制到字符串的算法,該算法必須有效地處理其嘗試執行的操作。 如果我沒記錯的話,它使用一個128符號代碼表(即128位編碼),因此它比base 64更緊湊。

最后,您將必須運行一些測試。 在開始測試之前,您必須知道算法何時足夠好 字符串大小必須多小才能被接受? 解析算法必須接受多快才能被接受。 您需要同時解析其中幾個? 只有您可以確定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM