0

文字列コレクションを一意の文字列に変換する方法が必要です。これは、コレクション内の文字列のいずれかが変更された場合、別の文字列が必要であることを意味します。

私は大きな解決策に取り組んでいるので、より良いアイデアに取り組むことができないかもしれません. 必要な一意の文字列は 2 つのコレクションを比較するために使用されるため、異なる文字列は異なるコレクションを意味します。順序が変わる可能性があり、2 つの文字列の比較に基づいて結果を返すようにソリューションが既に構築されているため、内部の文字列を 1 つずつ比較することはできません。これはアドオンです。生成された文字列は、この比較のパラメーターとして渡されます。

ありがとうございました!

4

5 に答える 5

1

制約を考慮して、区切られたアプローチを使用します。

区切り文字とエスケープ方法を選択します。たとえば、使用します。文字列 y \; 内でエスケープし、\ もエスケープします。\\

したがって、この文字列のリスト...

"A;bc"
"D\ef;"

...なる"A\;bc;D\\ef\;"

きれいではありませんが、文字列でなければならないことを考えると、csv とその兄弟の古き良き方法はそれほど悪くはありません。

于 2011-12-19T15:52:23.040 に答える
1

ハッシュ関数の使用はどうですか?

于 2011-12-19T15:49:37.143 に答える
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 に答える