0

我需要一种将字符串集合转换为唯一字符串的方法。这意味着如果集合中的任何字符串发生更改,我需要使用不同的字符串。

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

谢谢!

4

5 回答 5

1

使用哈希函数怎么样?

于 2011-12-19T15:49:37.143 回答
1

考虑到您的限制,请使用分隔方法:

选择分隔符和转义方法。例如使用;并在字符串 y \; 内转义它,也通过 \ 转义\\

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

"A;bc"
"D\ef;"

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

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

于 2011-12-19T15:52:23.040 回答
1

这些都通过决定使用分隔符“:”以及使用转义符来明确当我们通过分隔符表示其他含义时。因此,我们只需要在将它们与中间的分隔符连接之前转义所有字符串。这为每个集合提供了唯一的字符串。如果我们想让集合无论或顺序都相同,我们需要做的就是在我们做任何事情之前对我们的集合进行排序。我应该补充一点,我的示例使用 LINQ,因此假定集合实现IEnumerable<string>了,并且您有一个 using 声明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);
}
于 2011-12-19T15:58:58.017 回答
0

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

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

实现起来很简单,但在性能方面不是很聪明。

于 2011-12-19T15:51:32.820 回答
0

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

于 2011-12-19T15:51:49.327 回答