Как создать уникальную строку из коллекции строк?

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

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

Спасибо!

5 ответов

Решение

Они оба работают, решив использовать символ разделителя ":", а также использовать 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);
}

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

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

Итак, этот список строк...

"A;bc"
"D\ef;"

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

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

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

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

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

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

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

Другие вопросы по тегам