2009-08-09 31 views
5

Tôi đang sử dụng VB .NET và tôi biết rằng Union thường hoạt động ByRef nhưng trong VB, Strings thường được xử lý như thể chúng là kiểu dữ liệu nguyên thủy.Tại sao chức năng Liên minh trong LINQ không xóa các mục trùng lặp?

Do đó, đây là vấn đề:

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 chứa:
một
b
c
d
e

2.txt chứa:
b
c
d
e
f
g
h
i
j

Sau khi chạy mã, tôi nhận được:
một
b
c
d
e
b
f
g
h
i
j

Mọi góp ý để làm chức năng hành Liên minh như người đồng toán học của nó?

Trả lời

16

LINQ Union không thực hiện như bạn muốn nó. Đảm bảo tệp đầu vào của bạn chính xác (ví dụ: một trong các dòng có thể chứa dấu cách trước dòng mới) hoặc Trim() các chuỗi sau khi tách?

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 

Trong linqpad, kết quả là {"a", "s", "d", "f", "123" }

+0

Bạn đã tìm thấy sự cố. Cám ơn rất nhiều! –

2

Tôi nghĩ bạn muốn sử dụng chức năng Riêng biệt. Tại sau đó kết thúc của câu lệnh LINQ bạn làm .Distinct();

var distinctList = yourCombinedList.Distinct(); 

Tương tự như một 'SELECT DISTINCT trong SQL :)

+4

biệt không nên được yêu cầu sau khi phương pháp Liên minh LINQ của –

+0

Bạn là chính xác, tôi nên đã nói, danh sách 'kết hợp' trong ví dụ của tôi. Cập nhật nó để phản ánh cảm ơn đó. – Kelsey

Các vấn đề liên quan