Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: как сортировать массив As myClass? Добавлено: 13.12.09 02:30  

Автор вопроса:  DimDoc
Можно ли использовать array.sort() для сортировки массива типа Класс? Хотелось бы отсортировать по одному полю типа string.
Например:
создан класс:

Public Class Class1
    Private _name As String
    Private _x As String
    Public Property name() As String
        Get
            Return _name
        End Get
        Set(ByVal value As String)
            _name = value
        End Set
    End Property
    ' и так далее
End Class
[CODE]
Объявлен массив:
[CODE]Dim myArray() as Class1

наполняем массив:

Redim myArray(1)
myArray(0) as New Class1
myArray(0).name = "Яна"
myArray(0).tel = "999-99-99"
myArray(1) as New Class1
myArray(1).name = "Анна"
myArray(1).tel = "111-11-11"

теперь хотелось бы отсортировать...
примерно, так
array.sort(myArray)

но происходит ошибка.
наверно, потому что не указал - по какому полю сортировать.
Подскажите - как сортировать такие массивы?

Ответить

  Ответы Всего ответов: 6  

Номер ответа: 1
Автор ответа:
 Skywalker



ICQ: 300-70-6пятьЪ 

Вопросов: 62
Ответов: 545
 Web-сайт: iSkywalker.ru
 Профиль | | #1
Добавлено: 13.12.09 02:48
юзай linq
  1. Public Class Class1
  2.         Private _name As String
  3.         Private _x As String
  4.         Public Property name() As String
  5.             Get
  6.                 Return _name
  7.             End Get
  8.             Set(ByVal value As String)
  9.                 _name = value
  10.             End Set
  11.         End Property
  12.         Public Property x() As String
  13.             Get
  14.                 Return _x
  15.             End Get
  16.             Set(ByVal value As String)
  17.                 _x = value
  18.             End Set
  19.         End Property
  20.     End Class
  21. .......
  22. .......
  23.         Dim myArray(1) As Class1
  24.         myArray(0) = New Class1() With {.name = "1name", .x = "2x"}
  25.         myArray(1) = New Class1() With {.name = "2name", .x = "1x"}
  26.         myArray = (From el In myArray Order By el.x).ToArray()

Ответить

Номер ответа: 2
Автор ответа:
 DimDoc



Вопросов: 21
Ответов: 104
 Профиль | | #2 Добавлено: 13.12.09 03:29
Я с этим ещё не знаком...
Это отсортированный запрос???
Спасибо!

Ответить

Номер ответа: 3
Автор ответа:
 DimDoc



Вопросов: 21
Ответов: 104
 Профиль | | #3 Добавлено: 14.12.09 11:59
Попробовал!
Супер!!! Сортировка работает так - как надо!
И не надо создавать новый (сортированный) массив... Всё происходит внутри исходного массива...
Интересно, что при желании создать и заполнить новый отсортированный массив с помощью linq,
не требуется объявлять экземпляры класса с конструктором New.
Может я чего и не понял, но пока ошибок программы нет.
Даже с Option strict = on никаких проблем!
Спасибо!

Ответить

Номер ответа: 4
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #4 Добавлено: 14.12.09 20:04
Здесь создается новый массив и заменяет собой оригинальный.

Для того чтоб отсортировать данные в оригинальном массиве:
  1. Array.Sort(myArray, Function(a, b) String.Compare(a.x, b.x))

Ответить

Номер ответа: 5
Автор ответа:
 DimDoc



Вопросов: 21
Ответов: 104
 Профиль | | #5 Добавлено: 15.12.09 00:07
Извините... Я новичек... Ничего не понял...
Предыдущий пример для меня оказался понятным (хотя я linq не учил),
а Ваш пример для меня - тёмный лес (если конечно подробнее не объясните...)

Ответить

Номер ответа: 6
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #6 Добавлено: 16.12.09 04:46
Есть функция, которая сравнивает 2 объекта.
Если она считает что объект А больше объекта Б, она возвращает положительное число
Если считает что объект А меньше объекта Б, возвращает отрицательное число.
Если считает что оба объекта равны, то возвращает 0.

Я объявляю свою функцию сравнения 2-х объектов, которая просто сравнивает 2 свойства через String.Compare (работает точно так же).

Далее, есть метод Array.Sort, который выполняет сортировку массива, при этом для сравнения объектов в массиве принимает функцию сравнения. вызов выглядит следующим образом:

  1. Public Function CompareObjects (a As MyClass, b as MyClass) As Integer
  2.     Return String.Compare(a.x, b.x)
  3. End Function
  4.  
  5.  
  6. Array.Sort(myArray, AddressOf CompareObjects)


Это полная запись.
Благодаря возможность делать анонимные функции в VB 2008, можно сократить запись до

  1. Array.Sort(myArray, Function(a, b) String.Compare(a.x, b.x))

Здесь я не объявляю функцию отдельно, а прямо на месте создаю.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам