簡體   English   中英

如何從字符串集合中生成唯一的字符串?

[英]How to generate a unique string from a string collection?

我需要一種將字符串集合轉換為唯一字符串的方法。 這意味着,如果集合中的任何字符串已更改,我都需要使用其他字符串。

我正在開發一個大型解決方案,所以我可能無法使用一些更好的主意。 所需的唯一字符串將用於比較兩個集合,因此不同的字符串表示不同的集合。 我不能一一比較字符串,因為順序可能會更改,而且已經建立了基於2個字符串比較返回結果的解決方案。 這是一個附加組件。 生成的字符串將作為此比較的參數傳遞。

謝謝!

使用哈希函數呢?

考慮到您的約束,請使用定界方法:

選擇一個定界符和一個轉義方法。 例如使用; 並在字符串y \\;中轉義,也通過\\\\轉義\\

所以這個字符串列表...

"A;bc"
"D\ef;"

...成為"A\\;bc;D\\\\ef\\;"

它不是很漂亮,但是考慮到它必須是一個字符串,因此,csv及其兄弟們的舊方法還不錯。

這兩種方法都是通過決定使用分隔符“:”以及通過使用轉義符來使我們在用分隔符表示其他含義時變得清晰而起作用的。 因此,我們只需要轉義所有字符串,然后再使用它們之間的分隔符將它們連接起來即可。 這為每個集合提供了唯一的字符串。 如果要使集合相同(無論順序如何),我們需要做的就是在執行任何操作之前對集合進行排序。 我應該補充一點,我的示例使用LINQ,因此假定該集合實現IEnumerable<string> ,並且您對System.LINQ使用了using聲明

您可以將其包裝在一個函數中,如下所示

string GetUniqueString(IEnumerable<string> Collection, bool OrderMatters = true, string Escape = "/", string Separator = ":")
{
    if(Escape == Separator)
        throw new Exception("Escape character should never equal separator character because it fails in the case of empty strings");
    if(!OrderMatters) 
        Collection = Collection.OrderBy(v=>v);//Sorting fixes ordering issues.
    return Collection
        .Select(v=>v.Replace(Escape, Escape + Escape).Replace(Separator,Escape + Separator))//Escape String
        .Aggregate((a,b)=>a+Separator+b);
}

所謂“收集字符串”,是指“收集字符串”?

這是一種幼稚(但有效)的方法:對集合進行排序(以消除對順序的依賴性),合並它們,並對其進行哈希處理(例如MD5)。

實施起來很簡單,但在性能方面卻不是很聰明。

您是說需要將字符串集合編碼為字符串。 因此,例如集合{“ abc”,“ def”}可以被編碼為“ sDFSDFSDFSD”,而{“ a”,“ b”}可以被編碼為“ SDFeg”。 如果是這樣,並且您不關心唯一鍵,則可以使用SHA或MD5之類的東西。

暫無
暫無

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

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