此範例示範如何將來自不同來源的數據合併成新類型的序列。
備註
請勿嘗試將記憶體內部數據或文件系統中的數據與仍在資料庫中的數據聯結在一起。 這類跨網域聯結可能會產生未定義的結果,因為可能會針對資料庫查詢和其他類型的來源定義聯結作業的不同方式。 此外,如果資料庫中的數據量夠大,這類作業可能會導致記憶體不足例外狀況的風險。 若要將數據從資料庫聯結至記憶體內部數據,請先呼叫 ToList 或 ToArray 資料庫查詢,然後在傳回的集合上執行聯結。
若要建立數據檔
- 將 names.csv 和 scores.csv 檔案複製到您的項目資料夾中,如 如何:從不同檔案聯結內容 (LINQ) (Visual Basic) 中所述。
範例
下列範例示範如何使用具名型別 Student 來儲存從兩個模擬試算表數據的記憶體內字串集合合併而來的資料,這些字串會以 .csv 格式呈現。 字串的第一個集合代表學生名稱和標識符,而第二個集合則代表學生標識元(在第一個數據行中)和四個測驗分數。 標識碼會當做外鍵使用。
Imports System.Collections.Generic
Imports System.Linq
Class Student
Public FirstName As String
Public LastName As String
Public ID As Integer
Public ExamScores As List(Of Integer)
End Class
Class PopulateCollection
Shared Sub Main()
' Merge content from spreadsheets into a list of Student objects.
' These data files are defined in How to: Join Content from
' Dissimilar Files (LINQ).
' Each line of names.csv consists of a last name, a first name, and an
' ID number, separated by commas. For example, Omelchenko,Svetlana,111
Dim names As String() = System.IO.File.ReadAllLines("../../../names.csv")
' Each line of scores.csv consists of an ID number and four test
' scores, separated by commas. For example, 111, 97, 92, 81, 60
Dim scores As String() = System.IO.File.ReadAllLines("../../../scores.csv")
' The following query merges the content of two dissimilar spreadsheets
' based on common ID values.
' Multiple From clauses are used instead of a Join clause
' in order to store the results of scoreLine.Split.
' Note the dynamic creation of a list of integers for the
' ExamScores member. The first item is skipped in the split string
' because it is the student ID, not an exam score.
Dim queryNamesScores = From nameLine In names
Let splitName = nameLine.Split(New Char() {","})
From scoreLine In scores
Let splitScoreLine = scoreLine.Split(New Char() {","})
Where Convert.ToInt32(splitName(2)) = Convert.ToInt32(splitScoreLine(0))
Select New Student() With {
.FirstName = splitName(1), .LastName = splitName(0), .ID = splitName(2),
.ExamScores = (From scoreAsText In splitScoreLine Skip 1
Select Convert.ToInt32(scoreAsText)).ToList()}
' Optional. Store the query results for faster access in future
' queries. This could be useful with very large data files.
Dim students As List(Of Student) = queryNamesScores.ToList()
' Display each student's name and exam score average.
For Each s In students
Console.WriteLine("The average score of " & s.FirstName & " " &
s.LastName & " is " & s.ExamScores.Average())
Next
' Keep console window open in debug mode.
Console.WriteLine("Press any key to exit.")
Console.ReadKey()
End Sub
End Class
' Output:
' The average score of Svetlana Omelchenko is 82.5
' The average score of Claire O'Donnell is 72.25
' The average score of Sven Mortensen is 84.5
' The average score of Cesar Garcia is 88.25
' The average score of Debra Garcia is 67
' The average score of Fadi Fakhouri is 92.25
' The average score of Hanying Feng is 88
' The average score of Hugo Garcia is 85.75
' The average score of Lance Tucker is 81.75
' The average score of Terry Adams is 85.25
' The average score of Eugene Zabokritski is 83
' The average score of Michael Tucker is 92
在 Select 子句 子句中,物件初始化運算式是用來使用來自兩個來源的數據來具現化每個新 Student 物件。
如果您不需要儲存查詢的結果,匿名類型可能會比具名類型更方便。 如果您在執行查詢的方法之外傳遞查詢結果,則需要具名類型。 下列範例會執行與上一個範例相同的工作,但會使用匿名型別,而不是具名型別:
' Merge the data by using an anonymous type.
' Note the dynamic creation of a list of integers for the
' ExamScores member. We skip 1 because the first string
' in the array is the student ID, not an exam score.
Dim queryNamesScores2 =
From nameLine In names
Let splitName = nameLine.Split(New Char() {","})
From scoreLine In scores
Let splitScoreLine = scoreLine.Split(New Char() {","})
Where Convert.ToInt32(splitName(2)) = Convert.ToInt32(splitScoreLine(0))
Select New With
{.Last = splitName(0),
.First = splitName(1),
.ExamScores = (From scoreAsText In splitScoreLine Skip 1
Select Convert.ToInt32(scoreAsText)).ToList()}
' Display each student's name and exam score average.
For Each s In queryNamesScores2
Console.WriteLine("The average score of " & s.First & " " &
s.Last & " is " & s.ExamScores.Average())
Next