[VB.NET] การจัดอันดับที่มีค่าคะแนนเท่ากัน (Duplicate Ranking)
http://www.g2gnet.com/webboard/images/vbnet/duplicateranking.pngความหมายของการจัดอันดับที่มีค่าคะแนนเท่ากัน ก็จะคล้ายๆกับการเล่นกอล์ฟนั่นแหละครับ เช่นตามภาพ อันดับที่ 9 มีคะแนนเท่ากัน 3 คน ดังนั้นอันดับที่ 10 และ 11 ก็เลยไม่มี พอนับคนถัดไปก็จะไล่เรียงไปในลำดับที่ 12 ...
มาดูโค้ดกันเถอะ ... ' / ----------------------------------------------------------------
' / Developer : Mr.Surapon Yodsanga (Thongkorn Tubtimkrob)
' / eMail : thongkorn@hotmail.com
' / URL: http://www.g2gnet.com (Khon Kaen - Thailand)
' / Facebook: https://www.facebook.com/g2gnet (For Thailand)
' / Facebook: https://www.facebook.com/commonindy (Worldwide)
' / More info: http://www.g2gnet.com/webboard
' /
' / Purpose: How to sort duplicate ranking in DataGridView without DataBase.
' / Microsoft Visual Basic .NET (2010)
' /
' / This is open source code under @CopyLeft by Thongkorn Tubtimkrob.
' / You can modify and/or distribute without to inform the developer.
' / ----------------------------------------------------------------
Public Class frmRankingDuplicate
Dim dt As DataTable
Dim MaxRow As Integer = 15
' / ----------------------------------------------------------------
'// Initialize DataGridView @Run Time
Private Sub InitGrid()
With dgvData
.RowHeadersVisible = False
.AllowUserToAddRows = False
.AllowUserToDeleteRows = False
.AllowUserToResizeRows = False
.MultiSelect = True
.SelectionMode = DataGridViewSelectionMode.FullRowSelect
.ReadOnly = True
.Font = New Font("Tahoma", 9)
' Autosize Column
.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
.AutoResizeColumns()
'// Even-Odd Color
.AlternatingRowsDefaultCellStyle.BackColor = Color.AliceBlue
' Adjust Header Styles
With .ColumnHeadersDefaultCellStyle
.BackColor = Color.Navy
.ForeColor = Color.Black ' Color.White
.Font = New Font("Tahoma", 9, FontStyle.Bold)
End With
End With
End Sub
Private Sub frmRankingDuplicate_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
Me.Dispose()
Application.Exit()
End Sub
' / ----------------------------------------------------------------
Private Sub frmRankingDuplicate_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
Call InitGrid()
Call Ranking()
End Sub
' / ----------------------------------------------------------------
Private Sub Ranking()
Dim ds As New DataSet()
dt = New DataTable
dt.Columns.Add("Student", GetType(String))
dt.Columns.Add("Subject A", GetType(Integer))
dt.Columns.Add("Subject B", GetType(Integer))
dt.Columns.Add("Subject C", GetType(Integer))
dt.Columns.Add("Average", GetType(Double))
dgvData.DataSource = dt
'//
Randomize()
Dim RandomClass As New Random()
For i As Integer = 0 To MaxRow - 1
Dim dr As DataRow = dt.NewRow()
'// RandomClass
dr(0) = "Student " & i + 1
dr(1) = RandomClass.Next(0, 100)
dr(2) = RandomClass.Next(0, 100)
dr(3) = RandomClass.Next(0, 100)
Dim SumCol As Double = 0
For iCol As Byte = 1 To 3 'MaxCol
SumCol = SumCol + dr(iCol)
Next
dr(4) = Format(SumCol / 3, "0.00")
'//
dt.Rows.Add(dr)
Next
'// Calcualte ranking
dgvData.DataSource = RankingDuplicate(dt, "Average")
End Sub
' / ----------------------------------------------------------------
Public Function RankingDuplicate(dt As DataTable, fld As String) As DataTable
'// Descending (Z --> A)
Dim rankingDt = (From row In dt.AsEnumerable() Order By row.Field(Of Double)(fld) Descending.CopyToDataTable())
rankingDt.Columns.Add("Ranking")
Dim rank As Integer = 1
Dim count As Integer = 1
For i As Integer = 0 To rankingDt.Rows.Count - 2
rankingDt.Rows(i)("Ranking") = rank
'// If not duplicate value then increment +1.
If rankingDt.Rows(i)(fld).ToString() <> rankingDt.Rows(i + 1)(fld).ToString() Then
rank += 1
rank = count + 1
End If
count += 1
Next
rankingDt.Rows(rankingDt.Rows.Count - 1)("Ranking") = rank
Return rankingDt
End Function
Private Sub btnExit_Click(sender As System.Object, e As System.EventArgs) Handles btnExit.Click
Me.Close()
End Sub
Private Sub btnProcess_Click(sender As System.Object, e As System.EventArgs) Handles btnProcess.Click
Call Ranking()
End Sub
End Class
ดาวน์โหลดโค้ดต้นฉบับ VB.NET (2010) ได้ที่นี่ ...
หน้า:
[1]