PDA

View Full Version : sort کردن در Collection ها



VB.SOS
سه شنبه 29 شهریور 1390, 00:58 صبح
سلام دوستان عزیز
من می خوام یکسری اسم و یکسری نمره رو تو یکی از Collectionها بریزم و بعد sortشون کنم

وقتی انواع Collection رو بررسی کردم همشون اطلاعات رو به ترتیب key مرتب می کنن. اگه بخوام به ترتیب مقدار آیتم مرتب سازی انجام بشه باید از کدوم نوع استفاده کنم

ضمنا من index آیتم بعد از مرتب کردن برام مهمه (یعنی رتبه). این عدد رو چه طوری به دست بیارم.

ممنونم :قلب:

mehdi.mousavi
سه شنبه 29 شهریور 1390, 01:23 صبح
سلام.
اگر فرض کنیم چنین کلاسی داریم:


Public Class MyEntity
Public Property Name As String
Public Property Id As Integer
End Class


و بطور نمونه، لیستی از اون entity داریم که حاوی دو entity ی زیر هستش:


Dim entities As New List(Of MyEntity) From { _
New MyEntity() With {.Id = 200, .Name = "Jack"}, _
New MyEntity() With {.Id = 100, .Name = "Mehdi"} _
}

اونوقت برای مرتب سازی بر اساس Id می تونیم بدین شکل عمل کنیم:

Dim entitiesSortedById As List(Of MyEntity) = entities.OrderBy(Function(entity) entity.Id).ToList()

و همینطور، برای مرتب سازی بر اساس Name، می تونیم بدین شکل عمل کنیم:

Dim entitiesSortedByName As List(Of MyEntity) = entities.OrderBy(Function(entity) entity.Name).ToList()


موفق باشید.

پاورقی: برای مرتب سازی نزولی، باید از OrderByDescending جای OrderBy استفاده کنید.

VB.SOS
سه شنبه 29 شهریور 1390, 12:04 عصر
ممنون دوست عزیز. این کدها مربوط به کدوم ورژن VB.net میشن؟
من از ورژن ۲۰۰۸ استفاده می کنم

mehdi.mousavi
سه شنبه 29 شهریور 1390, 14:10 عصر
ممنون دوست عزیز. این کدها مربوط به کدوم ورژن VB.net میشن؟ من از ورژن ۲۰۰۸ استفاده می کنم

سلام.
کدی که من نوشتم از LINQ استفاده می کنه. اگر شما از .NET Framework 2.0 استفاده می کنید، می تونید بدین شکل عمل کنید.
باز هم فرض می کنیم همون کلاس رو داریم:

Public Class MyEntity
Public Property Name As String
Public Property Id As Integer
End Class

حالا برای سادگی، کلاس دیگه ای به برنامه اضافه می کنیم که توانایی مرتب سازی کلیه کلاس ها رو بر اساس پارامترهایی که بهش پاس می کنیم داشته باشه:


Public Class GenericComparer(Of T)
Implements IComparer(Of T)

Private ascending As Boolean
Private orderBy As String

Public Sub New(orderBy As String, ascending As Boolean)
Me.orderBy = orderBy
Me.ascending = ascending
End Sub

Public Function Compare(x As T, y As T) As Integer Implements IComparer(Of T).Compare
Dim propertyInfo As Reflection.PropertyInfo = GetType(T).GetProperty(Me.orderBy)

Dim obj1 As IComparable = DirectCast(propertyInfo.GetValue(x, Nothing), IComparable)
Dim obj2 As IComparable = DirectCast(propertyInfo.GetValue(y, Nothing), IComparable)

If Me.ascending Then
Return obj1.CompareTo(obj2)
End If

Return obj2.CompareTo(obj1)
End Function
End Class


حالا، فرض کنید لیستی از اون Entity ها داریم:


Dim entities As New List(Of MyEntity) From { _
New MyEntity() With {.Id = 200, .Name = "Jack"}, _
New MyEntity() With {.Id = 100, .Name = "Mehdi"} _
}


حالا برای Sort کردن این لیست بر اساس Id و بصورت Ascending، کافیه بدین شکل عمل کنیم:

entities.Sort(New GenericComparer(Of MyEntity)("Id", True))

یا برای مرتب سازی نزولی بر اساس Name میتونیم بدین شکل عمل کنیم:

entities.Sort(New GenericComparer(Of MyEntity)("Name", False))

موفق باشید.

پاورقی: کلیه کدهایی که در بخش VB.NET ارسال می کنم، توسط ابزارهای رایگان موجود Online از C# به VB.NET تبدیل شده و من از Syntax این زبان آگاه نیستم. بنابراین اگر احیانا ایرادهایی در کدهای ارسالی در بخش VB.NET از جانب من دیدید، بدونید اون ابزارها کارشون رو درست انجام نداده اند. :)

VB.SOS
سه شنبه 29 شهریور 1390, 17:50 عصر
آقای موسوی از لطفتون بی نهایت ممنونم
از توضیحی که تو پاورقی دادین متوجه مشکل شدم

من از NET Framework ۳٫۵ استفاده می کنم. اگه طرز استفاده از متد Find هم توضیح بدین ممنون میشم. من باید با استفاده از ID هر فرد index اون رو تو لیست مرتب شده به دست بیارم

mehdi.mousavi
سه شنبه 29 شهریور 1390, 18:15 عصر
آقای موسوی از لطفتون بی نهایت ممنونم از توضیحی که تو پاورقی دادین متوجه مشکل شدم من از NET Framework ۳٫۵ استفاده می کنم. اگه طرز استفاده از متد Find هم توضیح بدین ممنون میشم. من باید با استفاده از ID هر فرد index اون رو تو لیست مرتب شده به دست بیارم

سلام.
خواهش میکنم، این چه حرفیه... اگر از .NET 3.5 استفاده می کنید، پس LINQ رو در اختیار دارید و همون روش اول، روش مناسب تری هستش (شاید System.Core در لیست Reference های مورد استفاده در پروژه نیست، در نتیجه متود OrderBy رو نشناخته و ...). در هر حال، حتما از روش اول استفاده کنید...

اما برای پیدا کردن Index فردی که ID اش، فرضا 200 هستش، میتونید بدین شکل عمل کنید:


Dim idx As Integer = entities.FindIndex(Function(ent) ent.Id = 200)

یا پیدا کردن خود Entity:

Dim entity As MyEntity = entities.Find(Function(ent) ent.Id = 200)

موفق باشید.