2009-08-09 15 views
5

Używam VB .NET i wiem, że Unia normalnie działa ByRef, ale w VB, łańcuchy są generalnie przetwarzane tak, jakby były prymitywnymi typami danych.Dlaczego funkcja Unii w LINQ nie usuwa duplikatów?

konsekwencji, tu problem:

Sub Main() 
    Dim firstFile, secondFile As String(), resultingFile As New StringBuilder 

    firstFile = My.Computer.FileSystem.ReadAllText(My.Computer.FileSystem.SpecialDirectories.Desktop & "\1.txt").Split(vbNewLine) 
    secondFile = My.Computer.FileSystem.ReadAllText(My.Computer.FileSystem.SpecialDirectories.Desktop & "\2.txt").Split(vbNewLine) 

    For Each line As String In firstFile.Union(secondFile) 
     resultingFile.AppendLine(line) 
    Next 

    My.Computer.FileSystem.WriteAllText(My.Computer.FileSystem.SpecialDirectories.Desktop & "\merged.txt", resultingFile.ToString, True) 
End Sub 

1.txt zawiera:

b
C
d
e

2.txt zawiera:
b
c
d
e
F
g
H
i
J

Po uruchomieniu kodu uzyskać:

b
C
d
e
b
f
g
h
i
j

Wszelkie sugestie dotyczące dokonywania funkcję aktu Unii jak jego matematycznym odpowiednikiem?

Odpowiedz

16

LINQ Union wykonuje jak chcesz go. Upewnij się, że twoje pliki wejściowe są poprawne (np. Jedna z linii może zawierać spację przed nową linią) lub Trim() ciągi po podzieleniu?

var list1 = new[] { "a", "s", "d" }; 
var list2 = new[] { "d", "a", "f", "123" }; 
var union = list1.Union(list2); 
union.Dump(); // this is a LinqPad method 

W linqpad, wynik jest {"a", "s", "d", "f", "123" }

+0

Znalazłeś problem. Dzięki wielkie! –

2

Myślę, że chcesz użyć funkcji Distinct. Przy czym końcówka wyciągu LINQ zrobić .Distinct();

var distinctList = yourCombinedList.Distinct(); 

podobny do 'SELECT DISTINCT' w SQL :)

+4

Wyraźny nie powinno być wymagane po metody unijnej LINQ za –

+0

masz rację, powinienem powiedzieć, lista „łączone” w moim przykładzie. Aktualizuję to, aby odzwierciedlić to dzięki. – Kelsey