
نوشته شده توسط
mazoolagh
2- برای پیدا کردن min/max میشه مستقیم از compute برای datatable هم استفاده کرد:
dim dt as datatable=DataGridView1.datasource.defaultview.tot able
TextBox1.Text=dt.compute("min(date)","")
TextBox2.Text=dt.compute("max(date)","")
و باز هم نیازی به حلقه نیست
حلقه نیاز ما نیست، همونطور که کند شدن کد هم نیاز ما نیست. ما کدی رو انتخاب میکنیم که کارایی بهتری ایجاد کنه، مگر اینکه بخواهیم به دلیل خاصی ازش اجتناب کنیم.
چه نیازی داریم که کدی بنویسیم که چند برابر کند بشه؟ صرفا برای اینکه حلقه نداشته باشه؟ حلقه داشتن و نداشتن به خودی خود هیچ ارزش یا عیبی محسوب نمیشه.
Private _dg As New DataGridView
Private _lst As New ListBox
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Dim elapsed As Long
Button2.Enabled = False
_lst.Items.Add("please wait...")
Application.DoEvents()
_lst.Items.Add("Method1...")
Dim sw As New Stopwatch
sw.Start()
Dim dt As DataTable = _dg.DataSource.DefaultView.ToTable
TextBox1.Text = dt.Compute("min(date)", "")
TextBox2.Text = dt.Compute("max(date)", "")
sw.Stop()
elapsed = sw.ElapsedTicks
_lst.Items.Add("Elapsed (ticks): " & sw.ElapsedTicks)
sw.Reset()
_lst.Items.Add("Method2...")
Application.DoEvents()
sw.Start()
With _dg.Rows
If .Count > 0 Then
Dim minDate As String = .Item(0).Cells.Item("Date").Value
Dim maxDate As String = minDate
For i = 1 To .Count - 1
Dim d As String = .Item(i).Cells.Item("Date").Value
If d Is Nothing OrElse d.Length <> 10 Then Continue For
If minDate > d Then minDate = d
If maxDate < d Then maxDate = d
Next
TextBox1.Text = minDate
TextBox2.Text = maxDate
End If
End With
sw.Stop()
_lst.Items.Add("Elapsed (ticks): " & sw.ElapsedTicks)
_lst.Items.Add($"Method 1 is {((elapsed - sw.ElapsedTicks) / sw.ElapsedTicks):0.0} times slower.")
Button2.Enabled = True
End Sub