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

时间:2011-12-19 15:46:48

标签: c# stringcollection

我需要一种方法将字符串集合转换为唯一字符串。这意味着如果集合中的任何字符串发生了变化,我需要有一个不同的字符串。

我正在研究一个很大的解决方案,所以我可能无法使用一些更好的想法。必需的唯一字符串将用于比较2个集合,因此不同的字符串表示不同的集合。我无法逐个比较字符串,因为顺序可能会改变,而且已经构建了基于2字符串比较返回结果的解决方案。这是一个附加组件。生成的字符串将作为此比较的参数传递。

谢谢!

5 个答案:

答案 0 :(得分:1)

使用hash function怎么样?

答案 1 :(得分:1)

考虑到您的约束,请使用分隔方法:

选择分隔符和转义方法。 例如使用 ;并将其转义为字符串y \;,也可以通过\\

进行转义

所以这个字符串列表......

"A;bc"
"D\ef;"

...变为"A\;bc;D\\ef\;"

它不漂亮,但考虑到它必须是一个字符串,那么csv及其兄弟的好方法并不是太糟糕。

答案 2 :(得分:1)

这两者都可以通过决定使用&#34;的分隔符来实现:&#34;并且当我们用分隔符来表示其他东西时,还使用转义字符来表明它。因此,我们只需要在将它们与它们之间的分隔符连接之前转义所有字符串。这为每个系列提供了独特的字符串。我们需要做的就是如果我们想要使集合相同,或者命令是在我们做任何事情之前对我们的集合进行排序。我应该添加我的示例使用LINQ,因此假设集合实现IEnumerable<string>并且您有System.LINQ的使用声明

您可以将其包含在函数中,如下所示

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

答案 3 :(得分:0)

“收集字符串”是指“字符串集合”吗?

这是一种天真(但有效)的方法:对集合进行排序(以消除对顺序的依赖),对它们进行连接,并对其进行哈希处理(例如MD5)。

琐碎的实施,但不是非常聪明的表现。

答案 4 :(得分:0)

您是说您需要将字符串集合编码为字符串。因此,例如,集合{“abc”,“def”}可以被编码为“sDFSDFSDFSD”,但是{“a”,“b”}可以被编码为“SDFeg”。如果是这样,你不关心唯一键,那么你可以使用像SHA或MD5这样的东西。