Dictionary & Collection ?

Liên hệ QC

Hoàng Nhật Phương

Thành viên gắn bó
Tham gia
5/11/15
Bài viết
1,894
Được thích
1,213
Xin chào các Bạn,
Đầu xuân chúc mọi người luôn mạnh khỏe & bình an.
----
Như tiêu đề OT đã nêu, OT có đọc bài viết của Bạn Collection @befaint nhưng có lẽ do kiến thức còn hạn hẹp nên chưa thể hiểu hết về sự khác biệt giữa Dictionary & Collection,
Ví dụ trong 2 đoạn code dưới đây sử dụng Dictionary & Collection cho cùng một công việc:
Mã:
Option Explicit

Sub CollectionFilter()
Dim TT As Double
TT = Timer
Dim myCol As Collection
Set myCol = New Collection
Dim i As Long, lRow As Long, ArrData(), Result(), sKey As String, j As Long
With Sheet1
    lRow = .Range("B" & Rows.Count).End(xlUp).Row
    ArrData = .Range("B2:D" & lRow).Value2
    lRow = UBound(ArrData, 1)
    ReDim Result(1 To lRow, 1 To 4)
    For i = 1 To lRow
        sKey = ArrData(i, 1)
        If sKey <> "" Then
            If KeyExists(myCol, sKey) = False Then
                j = j + 1
                myCol.Add j, sKey
                Result(j, 1) = j
                Result(j, 2) = sKey
                Result(j, 3) = ArrData(i, 2)
                Result(j, 4) = ArrData(i, 3)
            Else
                Result(myCol.Item(sKey), 4) = Result(myCol.Item(sKey), 4) + ArrData(i, 3)
             End If
        End If
    Next i
    If j > 0 Then
        .Range("M2").Resize(100, 4).ClearContents
        .Range("M2").Resize(j, 4) = Result
        .Range("Q7") = Timer - TT
    End If
End With


End Sub


Sub DictionaryFilter()
Dim TT As Double
TT = Timer

Dim Dic As Object
Dim i As Long, lRow As Long, ArrData(), Result(), sKey As String, j As Long
Set Dic = CreateObject("Scripting.Dictionary")
With Sheet1
    lRow = .Range("B" & Rows.Count).End(xlUp).Row
    ArrData = .Range("B2:D" & lRow).Value2
    lRow = UBound(ArrData, 1)
    ReDim Result(1 To lRow, 1 To 4)
    For i = 1 To lRow
        sKey = ArrData(i, 1)
        If sKey <> "" Then
            If Not Dic.Exists(sKey) Then
                j = j + 1
                Dic.Add sKey, j
                Result(j, 1) = j
                Result(j, 2) = sKey
                Result(j, 3) = ArrData(i, 2)
                Result(j, 4) = ArrData(i, 3)
            Else
                Result(Dic.Item(sKey), 4) = Result(Dic.Item(sKey), 4) + ArrData(i, 3)
            End If
        End If
    Next i
    If j > 0 Then
        .Range("H2").Resize(100, 4).ClearContents
        .Range("H2").Resize(j, 4) = Result
        .Range("L7") = Timer - TT
    End If
End With

End Sub
Trên máy tính của OT có vẻ như Collection nhanh hơn Dictionary :
1613618736712.png

Nhờ các bạn chỉ dẫn cho OT hiểu rõ thêm trong trường hợp nào thì dùng cái nào sẽ tối ưu hơn?
Tại sao Collection nhanh hơn Dictionary mà không thấy mọi người sử dụng Collection mà thường sử dụng Dictionary hơn hay do thói quen ạ?
 

File đính kèm

  • Collection.xlsb
    1.2 MB · Đọc: 13
Lần chỉnh sửa cuối:
...Ví dụ trong 2 đoạn code dưới đây sử dụng Dictionary & Collection cho cùng một công việc:
Công việc gì?

...Nhờ các bạn chỉ dẫn cho OT hiểu rõ thêm trong trường hợp nào thì dùng cái nào sẽ tối ưu hơn?
Tối ưu là chuyện tương đối.
Chạy ra ga-ra xem một đống xe. Xong về hỏi "cái nào tối ưu?"
Đầu tiên hết, phải biết (giả sử chỉ để đi dạo phố, không phải xe chở hàng):
- ngân sách chi tại chỗ
- ngân sách chi định kỳ (bảo dưỡng, sửa chữa)
- nhà có mấy người
- bao lâu đi Đà lạt, Nha trang một lần (Vũng tàu, Long hải coi như gần, không kể)
...

Tại sao Collection nhanh hơn Dictionary mà không thấy mọi người sử dụng Collection mà thường sử dụng Dictionary hơn hay do thói quen ạ?
Nếu có Méc-sơ-đéc (đọc theo mới là mợt-sí-đì), còn ai muốn đi Ki-a hôn?
Vả lại, tốc độ còn tùy thuộc vào cách sử dụng và dữ liệu.
 
Upvote 0
Hiểu đơn giản nhất thì collection là tập hợp (y như cái tên gọi của nó). Còn dictionary là một dạng tập hợp các phần tử mang cặp giá trị [key-value], với key là duy nhất còn value trùng cũng chả sao. Key của dictionary y như khóa chính trong bảng CSDL vậy.

Ý niệm tập hợp khá tổng quát. Chẳng hạn tôi coi một bảng dữ liệu là tập hợp các record (row). Nhờ cách hiểu này mà sau này tôi tìm hiểu document-oriented database thì hầu như không quá khó khăn dù nó khác xa các dùng relational-database.
 
Upvote 0
Dạ, Bác đây rồi }}}}}
Công việc là công việc là cùng công việc lọc dữ liệu như trong tập tin và trong hình ảnh con gửi kèm Bác ơi.
Bài đã được tự động gộp:

Hiểu đơn giản nhất thì collection là tập hợp (y như cái tên gọi của nó). Còn dictionary là một dạng tập hợp các phần tử mang cặp giá trị [key-value], với key là duy nhất còn value trùng cũng chả sao. Key của dictionary y như khóa chính trong bảng CSDL vậy.

Ý niệm tập hợp khá tổng quát. Chẳng hạn tôi coi một bảng dữ liệu là tập hợp các record (row). Nhờ cách hiểu này mà sau này tôi tìm hiểu document-oriented database thì hầu như không quá khó khăn dù nó khác xa các dùng relational-database.
Cảm ơn Bạn nhiều,
OT cũng hay đọc nhiều bài viết của Bạn và cảm nhận rằng Bạn cũng thuộc top 'siêu cao thủ' về code.
Nếu Bạn hiểu rõ về 2 cái này , phiền Bạn có thể ví dụ cho OT biết trường hợp nào không thể sử dụng Dictionary mà buộc phải sử dụng Collection và ngược lại được không?
Có ví dụ và kèm theo code thì OT sẽ dễ hiểu hơn, chứ với OT mà nói chuyện lời lẽ về code thì như nước đổ lá khoai (@$%@
 
Upvote 0
Tại sao Collection nhanh hơn Dictionary mà không thấy mọi người sử dụng Collection mà thường sử dụng Dictionary hơn hay do thói quen ạ?
Có cái khác 'ngon' hơn thế nữa là đằng khác.
Chuyện thử nghiệm phải phân định các trường hợp của dữ liệu đầu vào để thử nghiệm:
- Add nhiều lần 1 key <--- thử nghiệm phần kiểm tra sự tồn tại key trong object;
- Add nhiều keys không trùng lần nào <--- kiểm tra Add key vào object;
- Add nhiều keys có tỉ lệ trùng 30-50-90%... <--- trường hợp hỗn hợp.
- Còn trường hợp kiểu dữ liệu của key: Number, String. Cái này Dictionary còn mệt nữa.

Việc Add key là công việc rất nặng nề, sau một thời gian thử nghiệm thấy Dictionary rất đuối.
 

File đính kèm

  • AddKeys.txt
    1.6 KB · Đọc: 19
Upvote 0
Có cái khác 'ngon' hơn thế nữa là đằng khác.
Chuyện thử nghiệm phải phân định các trường hợp của dữ liệu đầu vào để thử nghiệm:
- Add nhiều lần 1 key <--- thử nghiệm phần kiểm tra sự tồn tại key trong object;
- Add nhiều keys không trùng lần nào <--- kiểm tra Add key vào object;
- Add nhiều keys có tỉ lệ trùng 30-50-90%... <--- trường hợp hỗn hợp.
- Còn trường hợp kiểu dữ liệu của key: Number, String. Cái này Dictionary còn mệt nữa.

Việc Add key là công việc rất nặng nề, sau một thời gian thử nghiệm thấy Dictionary rất đuối.
Xin chào @befaint cảm ơn Bạn nhiều (người đã mang lại sự băn khoăn cho OT về vấn đề này :xmaslaugh:),
Với tập tin Bạn gửi OT có lẽ phải dành nhiều thời gian hơn để nghiên cứu, hiện hôm OT bắt đầu đi làm trở lại nên có thể thông tin sau ạ.
Với OT có lẽ từ những ví dụ đơn giản nhất thậm trí trong cuộc sống thực tế hàng ngày có lẽ OT mới hiểu hiểu đc chút ít.
 
Upvote 0
Tôi dùng VB6/VBA theo kiểu cỗ lỗ nên chưa bao giờ thử khai báo dictionary/collection, đến lúc xài C# thì mới có cơ hội trải nghiệm. Tuy nhiên nếu tinh ý thì chúng ta có thể phát hiện là VBA cung cấp rất nhiều các dictionary/collection dựng sẵn. Chẳng hạn tập hợp Sheets (hay sheet gì đó) có thể truy cập từng phần tử bằng tên (kiểu như dictionary). Tương tự trên Form ta cũng có tập hợp controls, trong đối tượng Recordset cũng có tập hợp Fields (dùng tên field truy cập y chang dictionary)... Các collection/dictionary có sẵn này chắc kể cả ngày chắc chả hết --=0

Kinh nghiệm để khám phá ra các collection hay dictionary là chú ý tới dạng số nhiều hoặc có thêm thuộc tính count, item... Dựa theo cách dùng của Microsoft thì chúng ta sẽ tự "nội suy" ra cách dùng cho riêng ta sao cho phù hợp thôi.

Ưu điểm khi xài collection là giúp code ngắn hơn và gần gũi với tư duy ngôn ngữ con người hơn chẳng hạn "for each... next" hiểu là "với mỗi phần tử... làm cái gì đó.". Còn với dictionary là một phiên bản đặc biệt của collection thì bạn cứ xem tình huống nào cần dùng tới key thì xài. Cứ học tập các collection/dictionary có sẵn mà chúng ta vẫn dùng chán chê hằng ngày rồi tìm cách ứng dụng cho trường hợp của bản thân.
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi thấy trên này ai đó hay sử dụng từ : thuật toán bảng băm đó .... thử mò ứng dụng xem sao ???
tôi toàn nghe nói cho vui à ... còn trên GPE này chưa thấy ai dùng nó ... mà tôi cũng ko có biết gì luôn
Nhưng tôi lại mới thấy trên Delphi tây nó viết ... mà nói thì tôi cũng ko biết nói từ đâu và như thế nào cho đúng
....
====> Nên cũng ko muốn nói và ko bao giờ nói cả :D:D:D
 
Upvote 0
Nhiều người hay lấy Collection và Dictionary để so sánh tốc độ chung chung là sai. Chúng ta chỉ so sánh khi làm một yêu cầu cụ thể. Và với yêu cầu cụ thể thì sẽ thấy rõ vai trò của từng cái. Hai đối tượng này có mục đích sử dụng khác nhau, tấc nhiên nó vẫn có thể dùng chung cho một mục đích nào đó. Bạn nên đọc tài liệu mô tả cấu trúc các thành phần của Collection và Dictionary.
 
Upvote 0
Xin chào các 'Đại ca' , cảm ơn các 'Đại ca' đã ghé thăm 'trại' của 'tiểu muội' và truyền đạt }}}}} :yahoo:, nhưng thực sự là 'tiểu muội' chưa đủ nội công để tiếp thu. (@$%@
Phiền các 'Đại ca' múa vài đường cơ bản của Collection và Dictionary được không ạ?
Bài đã được tự động gộp:

Nếu có Méc-sơ-đéc (đọc theo mới là mợt-sí-đì), còn ai muốn đi Ki-a hôn?
Vả lại, tốc độ còn tùy thuộc vào cách sử dụng và dữ liệu.
Collection là: Ki-a
còn Dictionary: Méc-sơ-đéc
Như vậy phải không Bác, nghĩa là cứ Méc-sơ-đéc mà đi Bác nhỉ }}}}}
 
Lần chỉnh sửa cuối:
Upvote 0
Với dữ liệu ở bài 1 thì tôi kiểm tra bằng For... Next còn nhanh hơn là Collection hay Dictionary. Vậy chắc cứ dùng vòng lặp là hiệu quả nhất :rolleyes:
Thớt thử ngẫm xem vì sao For... Next lại nhanh hơn, có thể ngộ ra điều gì đó.
Mã:
Sub ForNext()
Dim TT As Double
TT = Timer
Dim i As Long, lRow As Long, ArrData(), Result(), sKey As String, j As Long, k As Long
With Sheet1
    lRow = .Range("B" & Rows.Count).End(xlUp).Row
    ArrData = .Range("B2:D" & lRow).Value2
    lRow = UBound(ArrData, 1)
    ReDim Result(1 To lRow, 1 To 4)
    For i = 1 To lRow
        sKey = ArrData(i, 1)
        If sKey <> "" Then
            If KeyExists(Result, sKey, j, k) Then
                Result(k, 4) = Result(k, 4) + ArrData(i, 3)
            Else
                j = j + 1
                Result(j, 1) = j
                Result(j, 2) = sKey
                Result(j, 3) = ArrData(i, 2)
                Result(j, 4) = ArrData(i, 3)
            End If
        End If
    Next i
    If j > 0 Then
        .Range("M2").Resize(100, 4).ClearContents
        .Range("M2").Resize(j, 4) = Result
        .Range("Q7") = Timer - TT
    End If
End With
End Sub
Private Function KeyExists(Result, sKey, j, k) As Boolean
For k = 1 To j
    If Result(k, 2) = sKey Then
        KeyExists = True
        Exit For
    End If
Next
End Function
 
Upvote 0
Xin chào các 'Đại ca' , cảm ơn các 'Đại ca' đã ghé thăm 'trại' của 'tiểu muội' và truyền đạt }}}}} :yahoo:, nhưng thực sự là 'tiểu muội' chưa đủ nội công để tiếp thu. (@$%@
Phiền các 'Đại ca' múa vài đường cơ bản của Collection và Dictionary được không ạ?
Bài đã được tự động gộp:


Collection là: Ki-a
còn Dictionary: Méc-sơ-đéc
Như vậy phải không Bác, nghĩa là cứ Méc-sơ-đéc mà đi Bác nhỉ }}}}}
Không phải là vậy đâu nha, thằng Collection nó chạy chậm với dữ liệu lớn, ngược lại nó chạy rất nhanh, còn Dictionary thì nó vẫn có thể nói "giữ phong độ" từ dữ liệu nhiều đến dữ liệu ít.
Nếu lọc duy nhất ngoài 2 em trên ta cũng có thể dùng ComboBox để thực hiện, cũng rất hiệu quả đó nha.
 
Upvote 0
Xin lỗi tất cả các mọi người bài 1 khi nãy OT đính kèm nhập tin 'SortedList' ạ.. OT đã cập nhật lại :wallbash:
 
Upvote 0
Với dữ liệu ở bài 1 thì tôi kiểm tra bằng For... Next còn nhanh hơn là Collection hay Dictionary. Vậy chắc cứ dùng vòng lặp là hiệu quả nhất :rolleyes:
Thớt thử ngẫm xem vì sao For... Next lại nhanh hơn, có thể ngộ ra điều gì đó.
Mã:
Sub ForNext()
Dim TT As Double
TT = Timer
Dim i As Long, lRow As Long, ArrData(), Result(), sKey As String, j As Long, k As Long
With Sheet1
    lRow = .Range("B" & Rows.Count).End(xlUp).Row
    ArrData = .Range("B2:D" & lRow).Value2
    lRow = UBound(ArrData, 1)
    ReDim Result(1 To lRow, 1 To 4)
    For i = 1 To lRow
        sKey = ArrData(i, 1)
        If sKey <> "" Then
            If KeyExists(Result, sKey, j, k) Then
                Result(k, 4) = Result(k, 4) + ArrData(i, 3)
            Else
                j = j + 1
                Result(j, 1) = j
                Result(j, 2) = sKey
                Result(j, 3) = ArrData(i, 2)
                Result(j, 4) = ArrData(i, 3)
            End If
        End If
    Next i
    If j > 0 Then
        .Range("M2").Resize(100, 4).ClearContents
        .Range("M2").Resize(j, 4) = Result
        .Range("Q7") = Timer - TT
    End If
End With
End Sub
Private Function KeyExists(Result, sKey, j, k) As Boolean
For k = 1 To j
    If Result(k, 2) = sKey Then
        KeyExists = True
        Exit For
    End If
Next
End Function

Xin chào Anh @huuthang_bd, cảm ơn anh đã quan tâm & chỉ dẫn cụ thể hơn cho OT ạ:
Trong khả năng hiểu biết của OT thấy được 'ForNext' nhanh hơn Collection & Dictionary là vì ForNext chỉ chạy trong khoảng:
Mã:
For k = 1 To j
Nếu gặp key trùng nhau sẽ thoát khỏi vòng lặp:
Mã:
...
        If Result(k, 2) = sKey Then
            KeyExists = True
            Exit For
...
Trong khi Collection & Dictionary vẫn phải thực hiện các thao tác, kiểm tra key trong phạm vi:
For i = 1 To lRow

ủa nhưng mà có khác gì đâu nhỉ vì với Collection & Dictionary cũng kiểm tra trùng (có bao nhiêu key thì cũng tương tự For k = 1 To j như ForNext chỉ xet trong phạm vi đã gán key vào danh sách) :

với Collection:
Mã:
...
If KeyExists(myCol, sKey) = False Then
...
Mã:
'// Kiem tra su ton tai cua mot key trong Collection
Public Function KeyExists(myCol As Collection, ByVal keyCheck As String) As Boolean
    KeyExists = False
    On Error GoTo EndFunction
    myCol.Item keyCheck
    KeyExists = True
EndFunction:
End Function
với Dictionary :
Mã:
...
If Not Dic.Exists(sKey) Then
...

Hic, có lẽ OT cần nhiều thời gian để suy ngẫm ạ..
 
Upvote 0
Xin chào Anh @huuthang_bd, cảm ơn anh đã quan tâm & chỉ dẫn cụ thể hơn cho OT ạ:
Trong khả năng hiểu biết của OT thấy được 'ForNext' nhanh hơn Collection & Dictionary là vì ForNext chỉ chạy trong khoảng:
Mã:
For k = 1 To j
Nếu gặp key trùng nhau sẽ thoát khỏi vòng lặp:
Mã:
...
        If Result(k, 2) = sKey Then
            KeyExists = True
            Exit For
...
Trong khi Collection & Dictionary vẫn phải thực hiện các thao tác, kiểm tra key trong phạm vi:
For i = 1 To lRow

ủa nhưng mà có khác gì đâu nhỉ vì với Collection & Dictionary cũng kiểm tra trùng (có bao nhiêu key thì cũng tương tự For k = 1 To j như ForNext chỉ xet trong phạm vi đã gán key vào danh sách) :

với Collection:
Mã:
...
If KeyExists(myCol, sKey) = False Then
...
Mã:
'// Kiem tra su ton tai cua mot key trong Collection
Public Function KeyExists(myCol As Collection, ByVal keyCheck As String) As Boolean
    KeyExists = False
    On Error GoTo EndFunction
    myCol.Item keyCheck
    KeyExists = True
EndFunction:
End Function
với Dictionary :
Mã:
...
If Not Dic.Exists(sKey) Then
...

Hic, có lẽ OT cần nhiều thời gian để suy ngẫm ạ..
Thằng For ... Next nó lặp đi lặp lại từ đầu dữ liệu đến cuối dữ liệu để dò tìm "key" trùng, còn những thằng kia dường như nó cũng dò tìm nhưng dò tìm dữ liệu đã được add kiểu Find vậy đó nên nó "phát hiện" key trùng rất nhanh.
 
Upvote 0
Thằng For ... Next nó lặp đi lặp lại từ đầu dữ liệu đến cuối dữ liệu để dò tìm "key" trùng, còn những thằng kia dường như nó cũng dò tìm nhưng dò tìm dữ liệu đã được add kiểu Find vậy đó nên nó "phát hiện" key trùng rất nhanh.
Xin chào anh Nghĩa đẹp trai,
nghĩa là nếu chỉ cần xác định Key trùng hay không cứ 'ForNext' trong 'mảng':
Mã:
Private Function KeyExists(Result, sKey, j, k) As Boolean
    For k = 1 To j
        If Result(k, 2) = sKey Then
            KeyExists = True
            Exit For
        End If
    Next k
End Function
thì lúc nào cũng nhanh hơn là Collection,Dictionary phải không phải ạ?
Thưc tế OT đã sử dụng ForNext tại bài viết:
Mã:
Public Function aTimKiem(rFind As Range, sTim As String, c As Integer) As String
    Dim aData() As Variant, r As Long
    Const KXD As String = "Khong xac dinh"
    aData = rFind.Value2
    For r = 1 To UBound(aData, 1)
       If sTim = aData(r, 1) Then
            aTimKiem = aData(r, c)
            Exit For
       End If
    Next r
    If aTimKiem = Empty Then
        aTimKiem = KXD
    End If
End Function
Nhưng thực tế kết quả vẫn thua xa 'dictionary' so với vài viết của Bác @batman1 :
Mã:
    Set tenviettat = CreateObject("Scripting.dictionary")
    For r = 1 To UBound(FindPC_data, 1)
        skey = FindPC_data(r, 1)
        If Not tenviettat.exists(skey) Then tenviettat.Add skey, FindPC_data(r, 3)
    Next r
 
Lần chỉnh sửa cuối:
Upvote 0
Trong các bài viết trên đây thì câu phát biểu ở bài 9 của anh @Nguyễn Duy Tuân là đúng hơn cả:
"Nhiều người hay lấy Collection và Dictionary để so sánh tốc độ chung chung là sai. Chúng ta chỉ so sánh khi làm một yêu cầu cụ thể. Và với yêu cầu cụ thể thì sẽ thấy rõ vai trò của từng cái."
Tôi chỉ nói kinh nghiệm bản thân:
- Khi dữ liệu 1 triệu dòng, keys 10.000 cái, thì Dict và Collection tương đương, nhanh chậm hơn vài phần trăm giây
- Khi dữ liệu 10 ngàn dòng,, keys 9 ngàn, Dict rất rất chậm thậm chí chậm hơn thí dụ trên, Collection nhanh hơn 1 tẹo.
Cho nên đừng tuyên bố cái nào nhanh hơn cái nào.
 
Lần chỉnh sửa cuối:
Upvote 0
Xin chào anh Nghĩa đẹp trai,
nghĩa là nếu chỉ cần xác định Key trùng hay không cứ 'ForNext' trong 'mảng':
Mã:
Private Function KeyExists(Result, sKey, j, k) As Boolean
    For k = 1 To j
        If Result(k, 2) = sKey Then
            KeyExists = True
            Exit For
        End If
    Next k
End Function
thì lúc nào cũng nhanh hơn là Collection,Dictionary phải không phải ạ?
Ẹc ... ẹc ... với dữ liệu vài chục dòng thì sử dụng For ... Next cho nó đơn giản, chứ vài trăm vài ngàn dòng có mà chết!

Bài dưới đây tôi hướng dẫn bạn sử dụng ComboBox thật tiện lợi nè:

Mã:
Sub TestLocDuyNhat()
    Dim arrData
    Dim cbxTemp As MSForms.ComboBox
    Dim e As Long, n As Long, r As Long, u As Long
    Set cbxTemp = UserForm1.ComboBox1
    cbxTemp.Clear
    Sheet1.Columns("F:G").ClearContents
    e = Sheet1.Range("A" & Rows.Count).End(xlUp).Row
    arrData = Sheet1.Range("A1:B" & e).Value
    u = UBound(arrData)
    For r = 1 To u
        cbxTemp.Text = arrData(r, 1)
        If Not cbxTemp.MatchFound Then
            cbxTemp.AddItem arrData(r, 1), n
            cbxTemp.List(n, 1) = arrData(r, 2)
            n = n + 1
        Else
            cbxTemp.List(cbxTemp.ListIndex, 1) = cbxTemp.List(cbxTemp.ListIndex, 1) & " + " & arrData(r, 2)
        End If
    Next
    Sheet1.Range("F1:G" & cbxTemp.ListCount).Value = cbxTemp.List
End Sub
 

File đính kèm

  • ComboBox_Unique.xlsm
    22.3 KB · Đọc: 16
Upvote 0
Upvote 0
Tôi chỉ nói kinh nghiệm bản thân:
- Khi dữ liệu 1 triệu dòng, keys 10.000 cái, thì Dict nhanh hơn, Collection chậm hơn
- Khi dữ liệu 10 ngàn dòng,, keys 9 ngàn, Dict rất rất chậm thậm chí chậm hơn thí dụ trên, Collection nhanh hơn 1 tẹo.
... với dữ liệu vài chục dòng thì sử dụng For ... Next cho nó đơn giản, chứ vài trăm vài ngàn dòng có mà chết!
Chốt lại là theo kinh nghiệm của chú Mỹ & anh Nghĩa thì OT thấy dù dữ liệu ít hay nhiều thì cứ nên sử dụng Dictionary cho ổn định vì dữ liệu ít thì khỏi bàn về tốc độ còn dữ liệu nhiều thì cứ Dictionary mà dùng ạ?
----
Vấn đề là trong phạm vi bài toán yêu cầu chỉ sử dụng Collection & Dictionary không dược phép sử dụng cái khác (như For...next...)
- Trường hợp nào bắt buộc phải dùng Dictionary mà không thể dùng Collection.
- Trường hợp nào bắt buộc phải dùng Collection mà không thể dùng Dictionary.
=> Thì chưa có ví dụ cụ thể ạ... nên OT cũng không thấy được về mục đích sử dụng cũng giống như bài toán phân biệt giữa ByVal & ByRef vậy.
 
Upvote 0
Web KT
Back
Top Bottom