2009-08-09 17 views
5

Sto usando VB .NET e so che Union funziona normalmente con ByRef ma in VB, le stringhe vengono generalmente elaborate come se fossero dei tipi di dati primitivi.Perché l'unione non funziona in LINQ rimuovere le voci duplicate?

conseguenza, ecco il problema:

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 contiene:
un
b
c
d
e

2.txt contiene:
b
c
d
e
f
g
h
i
j

Dopo aver eseguito il codice, ottengo:
un
b
c
d
e
b
f
g
h
i
j

Eventuali suggerimenti per rendere la funzione di atto dell'Unione come la sua controparte matematica?

risposta

16

Linq Union non esegue come si desidera. Assicurati che i tuoi file di input siano corretti (ad esempio una delle righe potrebbe contenere uno spazio prima della nuova riga) o Trim() le stringhe dopo la divisione?

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 

Nel linqpad, il risultato è {"a", "s", "d", "f", "123" }

+0

Hai trovato il problema. Grazie mille! –

2

Penso che vogliate usare la funzione Distinti. Al poi fine della sua dichiarazione LINQ fare .Distinct();

var distinctList = yourCombinedList.Distinct(); 

Simile ad una 'SELECT DISTINCT' in SQL :)

+4

distinto non dovrebbe essere necessaria dopo che il metodo dell'Unione di Linq –

+0

Lei ha ragione, avrei dovuto dire, lista 'unita' nel mio esempio. Aggiornamento per riflettere questo grazie. – Kelsey

Problemi correlati