Удалить дубликаты в словаре

Привет, у меня есть словарь, который заполнен сущностями, соответствующими регулярному выражению. Он правильно извлекает все данные, за исключением того, что он также содержит дубликаты данных. Как я могу предотвратить появление дубликатов данных?

Вот мой код

    Dim largeFilePath As String = newMasterFilePath
    Dim lines1 = File.ReadLines(largeFilePath).ToList 'don't use ReadAllLines
    Dim reg = New Regex("\<\!NOTATION.*$|\<\!ENTITY.*$", RegexOptions.IgnoreCase)
    Dim entities = From line In lines1
                   Where reg.IsMatch(line)

    Dim dictionary As New Dictionary(Of Integer, String)
    Dim idx = -1
    For Each s In entities
        idx = lines1.IndexOf(s, idx + 1)
        dictionary.Add(idx, s)
    Next

    Dim deletedItems = 0
    For Each itm In dictionary
        lines1.RemoveAt(itm.Key - deletedItems)
        deletedItems += 1
    Next

    For Each s In dictionary.Values
        lines1.Insert(1, s)
    Next

Я ожидаю, что для каждого элемента будет только одна запись.

Это пример кода

<!DOCTYPE DOC PUBLIC "-//USA-DOD//DTD 38784STD-BV7//EN"[
<!ENTITY cdcs_5-35.wmf SYSTEM "graphics\CDCS_5-35.wmf" NDATA wmf>
<!ENTITY cdcs_2-2a.wmf SYSTEM "graphics\CDCS_2-2A.wmf" NDATA wmf>
<!NOTATION bmp SYSTEM "bmp">
<!NOTATION svg SYSTEM "svg">
<!NOTATION png SYSTEM "png">
<doc service = "xs" docid = "BKw46" docstat = "formal" verstatpg = "ver" cycle = "1" chglevel = "1">
<front numcols = "1">
<idinfo>
<?Pub Lcl _divid = "100" _parentid = "0">
<tmidno>Life with Pets</tmidno>
<chgnum>Change 1</chgnum>
<chgdate>2 August 2018</chgdate>
<chghistory>
<!NOTATION bmp SYSTEM "bmp">
<!NOTATION svg SYSTEM "svg">
<!NOTATION png SYSTEM "png">
<chginfo>
<chgtxt>Change 1</chgtxt>
<date>2 August 2018</date>
</front>
<!ENTITY cdcs_2-19.wmf SYSTEM "graphics\CDCS_2-19.wmf" NDATA wmf>
<!ENTITY cdcs_3-5.wmf SYSTEM "graphics\CDCS_3-5.wmf" NDATA wmf>
<!ENTITY cdcs_4-48.wmf SYSTEM "graphics\CDCS_4-48.wmf" NDATA wmf>
<body numcols = "1">
<chapter>
<title>This is chapter 1</title>
<!ENTITY cdcs_2-5.wmf SYSTEM "graphics\CDCS_2-5.wmf" NDATA wmf>
<!ENTITY cdcs_2-24.wmf SYSTEM "graphics\CDCS_2-24.wmf" NDATA wmf>
<para0>
<title>Climb the ladder immedietly</title>
<para>Retrieve the cat.</para></para0></chapter>
<chapter>
<title>Don't forget to feed the dog</title>
<!ENTITY cdcs_2-5.wmf SYSTEM "graphics\CDCS_2-5.wmf" NDATA wmf>
<!ENTITY cdcs_2-24.wmf SYSTEM "graphics\CDCS_2-24.wmf" NDATA wmf>
<para0>
<!ENTITY cdcs_4-48.wmf SYSTEM "graphics\CDCS_4-48.wmf" NDATA wmf>
<title>Prep for puppies</title>
<para>Puppies are cute</para></para0>
</chapter>
</body>
</doc>

Спасибо, что помогли мне в этом. Максимум

Этот связь должен вам помочь.

Brian M Stafford 10.04.2019 20:53

Планируете ли вы сначала удалить строки совпадений, а затем переместить уникальные значения наверх?

Top Systems 10.04.2019 20:55

Как насчет изменения запроса linq, вот с чего начать, а весь остальной код можно удалить...

Trevor 10.04.2019 21:20

@MuhammadAlnahrawy Я думал, что он поместит значения вверху, а затем удалит дубликаты. Или все же вы предлагаете

mightymax 10.04.2019 21:44
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
66
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Измените эту строку dictionary.Add(idx, s) на dictionary.Add(idx, s.Trim)

А потом:

Dim uniqueDict = dictionary.GroupBy(Function(itm) itm.Value).
                   Select(Function(group) group.First()).
                   ToDictionary(Function(itm) itm.Key, Function(itm) itm.Value)

For Each s In uniqueDict.Values
     lines.Insert(1, s)
Next

Результаты, все дубликаты удалены:

<!DOCTYPE DOC PUBLIC "-//USA-DOD//DTD 38784STD-BV7//EN"[
<!ENTITY cdcs_2-24.wmf SYSTEM "graphics\CDCS_2-24.wmf" NDATA wmf>
<!ENTITY cdcs_2-5.wmf SYSTEM "graphics\CDCS_2-5.wmf" NDATA wmf>
<!ENTITY cdcs_4-48.wmf SYSTEM "graphics\CDCS_4-48.wmf" NDATA wmf>
<!ENTITY cdcs_3-5.wmf SYSTEM "graphics\CDCS_3-5.wmf" NDATA wmf>
<!ENTITY cdcs_2-19.wmf SYSTEM "graphics\CDCS_2-19.wmf" NDATA wmf>
<!NOTATION png SYSTEM "png">
<!NOTATION svg SYSTEM "svg">
<!NOTATION bmp SYSTEM "bmp">
<!ENTITY cdcs_2-2a.wmf SYSTEM "graphics\CDCS_2-2A.wmf" NDATA wmf>
<!ENTITY cdcs_5-35.wmf SYSTEM "graphics\CDCS_5-35.wmf" NDATA wmf>
<doc service = "xs" docid = "BKw46" docstat = "formal" verstatpg = "ver" cycle = "1" chglevel = "1">
<front numcols = "1">
<idinfo>
<?Pub Lcl _divid = "100" _parentid = "0">
<tmidno>Life with Pets</tmidno>
<chgnum>Change 1</chgnum>
<chgdate>2 August 2018</chgdate>
<chghistory>
<chginfo>
<chgtxt>Change 1</chgtxt>
<date>2 August 2018</date>
</front>
<body numcols = "1">
<chapter>
<title>This is chapter 1</title>
<para0>
<title>Climb the ladder immedietly</title>
<para>Retrieve the cat.</para></para0></chapter>
<chapter>
<title>Don't forget to feed the dog</title>
<para0>
<title>Prep for puppies</title>
<para>Puppies are cute</para></para0>
</chapter>
</body>
</doc>

Это удалило все <!Entity, кроме дубликатов.

mightymax 10.04.2019 21:50

@MaxineHammett это сработало для меня, и я получил ожидаемые результаты, вы пробовали это с вашим образцом текста здесь?

Top Systems 10.04.2019 21:57

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

mightymax 10.04.2019 21:59

проверьте мои результаты, пожалуйста.

Top Systems 10.04.2019 22:06

Я верю вашим результатам. Я просто не знаю, куда вставить код. Нужна помощь пожалуйста

mightymax 10.04.2019 22:07

Замените эту часть старого кода полностью новым: For Each s In dictionary.Values lines1.Insert(1, s) Next

Top Systems 10.04.2019 22:09

Давайте продолжить обсуждение в чате.

mightymax 10.04.2019 22:10

Мухаммед, встретимся со мной в чате, пожалуйста

mightymax 10.04.2019 22:15

В качестве альтернативы проверьте наличие дубликатов перед добавлением:

For Each s In entities
    If Not dictionary.TryGetValue(lines1.IndexOf(s, idx + 1), s) Then
        idx = lines1.IndexOf(s, idx + 1)
        dictionary.Add(idx, s)
    End If
Next

Я получаю сообщение об ошибке "Элемент с таким ключом уже добавлен"

mightymax 10.04.2019 22:02

Это часть lines1.IndexOf(s, idx + 1), которая неверна. Я не был уверен, как правильно это сделать, не нарушая ваш код, поэтому немного догадался. Это должно быть одинаково, когда вы ищете дубликат и когда добавляете элемент в коллекцию.

laancelot 10.04.2019 22:11

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