Как создать уникальную строку из коллекции строк? - PullRequest
0 голосов
/ 19 декабря 2011

Мне нужен способ конвертировать коллекцию строк в уникальную строку. Это означает, что мне нужна другая строка, если какая-либо из строк внутри коллекции изменилась.

Я работаю над большим решением, поэтому я не смогу работать с некоторыми лучшими идеями. Требуемая уникальная строка будет использоваться для сравнения двух коллекций, поэтому разные строки означают разные коллекции. Я не могу сравнить строки внутри одной за другой, потому что порядок может измениться, плюс решение уже построено, чтобы вернуть результат, основанный на сравнении двух строк. Это дополнение. Сгенерированная строка будет передана в качестве параметра для этого сравнения.

Спасибо!

Ответы [ 5 ]

1 голос
/ 19 декабря 2011

Они оба работают, решив использовать символ разделителя «:», а также использовать escape-символ, чтобы было ясно, когда мы подразумеваем что-то другое под символом разделителя.Поэтому нам просто нужно экранировать все наши строки, прежде чем объединять их с нашим разделителем между ними.Это дает нам уникальные строки для каждой коллекции.Все, что нам нужно сделать, если мы хотим, чтобы коллекции были одинаковыми независимо или в порядке, - это отсортировать нашу коллекцию, прежде чем мы что-то сделаем.Я должен добавить, что мой образец использует 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);
}
1 голос
/ 19 декабря 2011

Учитывая ваши ограничения, используйте подход с разделителями:

выберите разделитель и метод escape.например, использовать;и экранировать его внутри строк y \ ;, также экранировать \ by \\

Таким образом, этот список строк ...

"A;bc"
"D\ef;"

... становится "A\;bc;D\\ef\;"

Это не красиво, но, учитывая, что это должна быть строка, тогда старые добрые способы csv и его братьев не так уж и плохи.

1 голос
/ 19 декабря 2011

Как насчет использования хеш-функции ?

0 голосов
/ 19 декабря 2011

Вы говорите, что вам нужно закодировать коллекцию строк в виде строки.Так, например, коллекция {"abc", "def"} может быть закодирована как "sDFSDFSDFSD", а {"a", "b"} может быть закодирована как "SDFeg".Если это так и вам не нужны уникальные ключи, вы можете использовать что-то вроде SHA или MD5.

0 голосов
/ 19 декабря 2011

Под «строкой коллекции» вы подразумеваете «коллекцию строк»?

Вот наивный (но работающий) подход: отсортировать коллекцию (чтобы устранить зависимость от порядка), объединить их и взять хешэтого (например, MD5).

Тривиально для реализации, но не очень умно с точки зрения производительности.

...