Привет, у меня есть словарь, который заполнен сущностями, соответствующими регулярному выражению. Он правильно извлекает все данные, за исключением того, что он также содержит дубликаты данных. Как я могу предотвратить появление дубликатов данных?
Вот мой код
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>
Спасибо, что помогли мне в этом. Максимум
Планируете ли вы сначала удалить строки совпадений, а затем переместить уникальные значения наверх?
Как насчет изменения запроса linq, вот с чего начать, а весь остальной код можно удалить...
@MuhammadAlnahrawy Я думал, что он поместит значения вверху, а затем удалит дубликаты. Или все же вы предлагаете
Измените эту строку 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, кроме дубликатов.
@MaxineHammett это сработало для меня, и я получил ожидаемые результаты, вы пробовали это с вашим образцом текста здесь?
Я не думаю, что у меня есть это в коде правильно. Не могли бы вы обновить свой код, показав, куда он пойдет в моем, пожалуйста
проверьте мои результаты, пожалуйста.
Я верю вашим результатам. Я просто не знаю, куда вставить код. Нужна помощь пожалуйста
Замените эту часть старого кода полностью новым: For Each s In dictionary.Values lines1.Insert(1, s) Next
Давайте продолжить обсуждение в чате.
Мухаммед, встретимся со мной в чате, пожалуйста
В качестве альтернативы проверьте наличие дубликатов перед добавлением:
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
Я получаю сообщение об ошибке "Элемент с таким ключом уже добавлен"
Это часть lines1.IndexOf(s, idx + 1)
, которая неверна. Я не был уверен, как правильно это сделать, не нарушая ваш код, поэтому немного догадался. Это должно быть одинаково, когда вы ищете дубликат и когда добавляете элемент в коллекцию.
Этот связь должен вам помочь.