List (Of String) Distinct имеет дубликаты - PullRequest
0 голосов
/ 04 августа 2020

У меня есть этот код, который создает список (Of String), каждая строка содержит строку CSV, которая анализируется и разделяется.

Входная строка имеет формат: ривароксабан, цетиризин , фуросемид, ультрабрижален, парацетанол, нитрофурантоин, вакомицин, тиамин, TOD

 Dim dView As GridView = view1.GetDetailView(view1.FocusedRowHandle, view1.GetVisibleDetailRelationIndex(view1.FocusedRowHandle))
    Dim f = dView.GetFocusedRowCellValue("FormName")
    Dim l = dView.GetFocusedRowCellValue("Label")
    Dim path As String = "Y:\Temp\" & l & ".xls"
    Dim mylist As New List(Of String)
    Dim t As TextInfo = New CultureInfo("en-GB", False).TextInfo
    Dim myarray As String()
    Dim Lines() = PatientList.ExortValues(f, l).ToArray

    Dim delimiters As Char() = {","c, ";"c, " "c, ControlChars.CrLf}
    For Each line In Lines
        For Each item In line.Split(delimiters, StringSplitOptions.RemoveEmptyEntries)
            mylist.Add(t.ToTitleCase(item).Trim)
        Next
    Next

    mylist.Sort()

    Using writer As StreamWriter = New StreamWriter(path)          
        Dim dList = mylist.Distinct
        dList.ForEach(Sub(c) writer.WriteLine(c))
        'Debug.Print(grp)
    End Using

Когда я просматриваю выходные данные StreamWriter, я вижу дубликаты в файле

+-------------+
| Allopunnol  |
+-------------+
| Allopurinol |
+-------------+
| Allopurinol |
+-------------+
| Allopurinol |
+-------------+
| Allopurinol |
+-------------+
| Allopurinol |
+-------------+
| Allopurinol |
+-------------+
| Allopurinol |
+-------------+
| Allopurinol |
+-------------+
| Allopurinol |
+-------------+
| Allopurnol  |
+-------------+

Я также пробовал Dim g = mylist.GroupBy(Function(x) x.Trim).OrderByDescending(Function(z) z.Key).Select(Function(h) h.Key)

Мне кажется, что мне чего-то не хватает, но я не могу этого понять.

Изменить : mylist.Distinct.ToList не влияет на вывод. Еще остаются дубликаты.

Ответы [ 2 ]

1 голос
/ 04 августа 2020

Это слепая попытка использовать Linq

ListOfString.Distinct().ToList

Моя ссылка Здесь: remove-duplicates-from-listof-t

0 голосов
/ 04 августа 2020

Если вам не нужны дубликаты, возможно, вам следует использовать HashSet(Of String). Его метод Add вернет Boolean, чтобы указать, был ли добавлен новый элемент или нет, чего не будет, если он такой же, как существующий элемент. Следует отметить, что HashSet(Of T) реализует ICollection(Of T), но не IList(Of T), поэтому вы можете перечислить его и получить элемент Count, но вы не можете получить доступ к элементам по индексу.

Dim myList As New HashSet(Of String)

'...

mylist.Add(t.ToTitleCase(item.Trim()))

'...

File.WriteAllLines(path, myList.OrderBy(Function(s) s))

Обратите внимание, что в HashSet(Of T) нет метода Sort, поэтому для сортировки используется метод LINQ OrderBy.

Обратите внимание также на вызов File.WriteAllLines, который позволяет записывать список значений в текстовый файл гораздо более лаконично.

...