Как создать уникальную строку из коллекции строк?
Мне нужен способ конвертировать коллекцию строк в уникальную строку. Это означает, что мне нужно иметь другую строку, если какая-либо из строк внутри коллекции изменилась.
Я работаю над большим решением, поэтому я не смогу работать с лучшими идеями. Требуемая уникальная строка будет использоваться для сравнения двух коллекций, поэтому разные строки означают разные коллекции. Я не могу сравнить строки внутри одной за другой, потому что порядок может измениться, плюс решение уже построено, чтобы вернуть результат, основанный на сравнении двух строк. Это дополнение. Сгенерированная строка будет передана в качестве параметра для этого сравнения.
Спасибо!
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).
Тривиально реализовать, но не очень умно с точки зрения производительности.