Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.59/34: Рейтинг темы: голосов - 34, средняя оценка - 4.59
3a9Iac
0 / 0 / 1
Регистрация: 21.04.2012
Сообщений: 21
1

Как пользоваться функцией Array.Sort() для сортировки по алфавиту

07.05.2012, 12:34. Просмотров 6806. Ответов 20
Метки нет (Все метки)

Всем привет обьясните пожалуйсто как пользоваться функцией Array.Sort(); для сортировке по алфавиту для коллекций....
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.05.2012, 12:34
Ответы с готовыми решениями:

Сортировка функцией Array.Sort
Даже числа не выводит,чес слово. Что исправить? static void Main(string args) { ...

Как работает Array.Sort
Собственно вопрос в том, как всё-таки работает сортировка Array.Sort? Этот вопрос возник потому,...

Как пользоваться методом Array.Find
Здравствуйте ! Подскажите , как допустим в таком массиве найти есть ли в нем число ...

Как пользоваться функцией GetWindowThreadProcessId
Сломал себе уже весь мозг, помогите, плз! Какую библиотеку нужно подключить, или что-то прописать,...

Принцип сортировки Array.Sort
Всем добрый день/вечер/ночь. Есть массив, содержащий в себе некую информацию. Каждый элемент...

20
I2um1
Злой няш
1413 / 1111 / 374
Регистрация: 05.04.2010
Сообщений: 1,949
07.05.2012, 12:35 2
3a9Iac, для какой коллекции?
1
3a9Iac
0 / 0 / 1
Регистрация: 21.04.2012
Сообщений: 21
07.05.2012, 12:41  [ТС] 3
для коллекции record по name
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.IO;
using System.Collections.ObjectModel;
using System.Windows.Forms;
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public class Record
        {
            public String Name, date, za4;
 
        }
        public Collection<Record> records = new Collection<Record>();
        StreamReader reader;
        StreamWriter writer;
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            Record record;
            reader = new StreamReader("d:\\data.txt");
            while (!reader.EndOfStream)
            {
                record = new Record();
                record.Name = reader.ReadLine();
                record.date = reader.ReadLine();
                record.za4 = reader.ReadLine();
                reader.ReadLine();
                records.Add(record);
                
 
            }
            reader.Close();
            listBox1.Items.Clear();
            for (int i = 0; i < records.Count; i++)
            {
                listBox1.Items.Add(records[i].Name + ' ' + records[i].date + ' ' + records[i].za4);
            }
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            Array.Sort(records);             //вот тут мне надо как то отсортировать...
        
}
Добавлено через 2 минуты
Тут прочитал что надо задействовать интерфейс IComparable только незнаю как(
0
I2um1
Злой няш
1413 / 1111 / 374
Регистрация: 05.04.2010
Сообщений: 1,949
07.05.2012, 12:49 4
Цитата Сообщение от 3a9Iac Посмотреть сообщение
Тут прочитал что
Цитата Сообщение от http://msdn.microsoft.com/en-us/library/system.array.sort(v=vs.71).aspx
Array.Sort Method
Sorts the elements in one-dimensional Array objects.
Замени Collection<Record> на List<Record>, после будет работать такая штука:
C#
1
records.Sort((x, y) => String.CompareOrdinal(x.Name, y.Name));
А про Collection<Record> - вообще забудь, что она существует.
1
07.05.2012, 12:49
3a9Iac
0 / 0 / 1
Регистрация: 21.04.2012
Сообщений: 21
07.05.2012, 12:52  [ТС] 5
Это будет сортировка по алфавиту?
0
I2um1
Злой няш
1413 / 1111 / 374
Регистрация: 05.04.2010
Сообщений: 1,949
07.05.2012, 12:55 6
3a9Iac, да.
1
3a9Iac
0 / 0 / 1
Регистрация: 21.04.2012
Сообщений: 21
07.05.2012, 12:57  [ТС] 7
Хмм..У меня сортирует только когда на английском.....А как сделать на русском?

Добавлено через 47 секунд
Спасибо большое....Хм еще вопрос)...А неподскажеш как мне сортировать еще и по возрасту?...
0
Ilya81
151 / 151 / 30
Регистрация: 19.10.2009
Сообщений: 319
07.05.2012, 12:59 8
Всё правильно, именно этот интерфейс нужно реализовать у класса Record. Например:
C#
1
2
3
4
5
6
7
8
public class Record:IComparable{
int CompareTo(object obj){
Record other = obj as Record;
if (other == null)
throw new InvalidOperationException();
return string.Compare(Name, other.Name);
}
}
P. S. Вместо reader.Close(); я б рекомендовал оператор using, иначе в случае ошибки он не закроет файл. А для формирования названия элемента я б рекомендовал:
C#
1
listBox1.Items.Add(string.Format("{0} {1} {2}", records[i].Name, records[i].date, records[i].za4));
Ибо оператор + создаёт каждый раз новый экзпемпляр строки, что явно не оптимально.
0
3a9Iac
0 / 0 / 1
Регистрация: 21.04.2012
Сообщений: 21
07.05.2012, 13:00  [ТС] 9
Илья я только начал изучать си шарп пожалуйсто не мог бы ты поподробнее и попонятнее?)
0
I2um1
Злой няш
1413 / 1111 / 374
Регистрация: 05.04.2010
Сообщений: 1,949
07.05.2012, 13:03 10
Цитата Сообщение от 3a9Iac Посмотреть сообщение
А неподскажеш как мне сортировать еще и по возрасту?...
Дату необходимо хранить в более читаемом виде сперва, к примеру DateTime, а не string. И что это за сортировка? Отдельная или должна накладываться на результат сортировки по имени?

Цитата Сообщение от 3a9Iac Посмотреть сообщение
А как сделать на русском?
Я на русском проверял.
1
3a9Iac
0 / 0 / 1
Регистрация: 21.04.2012
Сообщений: 21
07.05.2012, 13:08  [ТС] 11
Ну мне надо чтоб нажал одну кнопочку он сортирует по имени...вторую по возрасту....третью по среднему баллу....как то так...А как сделать мне сделать это?...что бы одно в дата тайм другая в стринг?....

Добавлено через 2 минуты
У меня почему то в лист боксе симбволы неотображаются рисует ромбик а в нем знак вопроса...Незнаете как это исправить?
0
I2um1
Злой няш
1413 / 1111 / 374
Регистрация: 05.04.2010
Сообщений: 1,949
07.05.2012, 13:14 12
Цитата Сообщение от 3a9Iac Посмотреть сообщение
Ну мне надо чтоб нажал одну кнопочку он сортирует по имени...вторую по возрасту....третью по среднему баллу....как то так
В том, что я написал для сортировки, заменяется Name на нужное. Вот только с датой надо иначе.

Цитата Сообщение от 3a9Iac Посмотреть сообщение
что бы одно в дата тайм другая в стринг?....
DateTime можно преобразовывать в string.

Цитата Сообщение от 3a9Iac Посмотреть сообщение
У меня почему то в лист боксе симбволы неотображаются рисует ромбик а в нем знак вопроса...
При считывании данных с источника была указана (если вообще была указана) неверно кодировка.

Что-то много банальных вопросов, может стоит взять в руки учебник по C#?
1
3a9Iac
0 / 0 / 1
Регистрация: 21.04.2012
Сообщений: 21
07.05.2012, 13:15  [ТС] 13
Я не указывал кодировку не подскажеш как ее указать?)
DateTime можно преобразовывать в string. - А как?)
А как с датой?
Прости за мою тупость(
0
I2um1
Злой няш
1413 / 1111 / 374
Регистрация: 05.04.2010
Сообщений: 1,949
07.05.2012, 13:21 14
Цитата Сообщение от 3a9Iac Посмотреть сообщение
Я не указывал кодировку не подскажеш как ее указать?)
Я так подозреваю значения брались с файла? Надо передать при считывании еще свойство System.Text.Encoding.Default. (Вместо Default подставить нужное - ItelliSense подскажет)

Цитата Сообщение от 3a9Iac Посмотреть сообщение
DateTime можно преобразовывать в string. - А как?)
DateTime format

Цитата Сообщение от 3a9Iac Посмотреть сообщение
А как с датой?
У класса DateTime есть свойство Now. А у экземпляра объекта DateTime есть Year. Итого что-то типа:
C#
1
var age = DateTime.Now.Year - record.Date.Year;
В последствии сравнить их.
1
3a9Iac
0 / 0 / 1
Регистрация: 21.04.2012
Сообщений: 21
07.05.2012, 13:27  [ТС] 15
А куда вставлять System.Text.Encoding. ?
Хм
Цитата Сообщение от Blood-Angel Посмотреть сообщение
var age = DateTime.Now.Year - record.Date.Year
перед этим мы должны представить record в DateTime ? Если так я попробывал тогда при считывании из файла он пишет ошибку....
0
I2um1
Злой няш
1413 / 1111 / 374
Регистрация: 05.04.2010
Сообщений: 1,949
07.05.2012, 13:34 16
Цитата Сообщение от 3a9Iac Посмотреть сообщение
перед этим мы должны представить record в DateTime ?
Что? Это еще нафига?
Вытягиваешь из меня код, самому надо было подумать:
C#
1
records.Sort((x, y) => (DateTime.Now.Year - x.Date.Year).CompareTo(DateTime.Now.Year - y.Date.Year));
Цитата Сообщение от 3a9Iac Посмотреть сообщение
А куда вставлять System.Text.Encoding. ?
А от куда мне знать каким боком ты открываешь файл и считываешь данные. Я конечно предполагаю, что с помощью файлового потока, но все же. Во время создания этого самого потока, один из его конструкторов должен принимать кодировку.
1
3a9Iac
0 / 0 / 1
Регистрация: 21.04.2012
Сообщений: 21
07.05.2012, 13:46  [ТС] 17
reader = new StreamReader("d:\\data.txt", Encoding.(тута кодировка?)); должно выглядеть так да?...
ДА не вытягиваю я...честно просто невдупляю как(((

Добавлено через 4 минуты
С кодировкой разобрался спасибо)

Добавлено через 2 минуты
Цитата Сообщение от Blood-Angel Посмотреть сообщение
1 records.Sort((x, y) => (DateTime.Now.Year - x.Date.Year).CompareTo(DateTime.Now.Year - y.Date.Year));
Тут пишет уйму ошибок=(

Добавлено через 4 минуты
Там надо где то сначало преобразовать record.date из стринга в datatime?
0
I2um1
Злой няш
1413 / 1111 / 374
Регистрация: 05.04.2010
Сообщений: 1,949
07.05.2012, 13:47 18
Цитата Сообщение от 3a9Iac Посмотреть сообщение
Тут пишет уйму ошибок=(
Исправь Record на:
C#
1
2
3
4
5
6
    public class Record
    {
        public String Name, za4;
        public DateTime Date;
 
    }
Я же об этом говорил.
И он сортирует по убыванию, чтобы сортировало по не убыванию, необходимо поменять местами x и y в скобках слева.
1
3a9Iac
0 / 0 / 1
Регистрация: 21.04.2012
Сообщений: 21
07.05.2012, 13:55  [ТС] 19
А какие тут библиотеки нужны дополнительные? Ой не туплю сорри слушай теперь ошибка тут
C#
1
record.Date = reader.ReadLine();
тут надо конвертировать?

Добавлено через 4 минуты
record.Date = Convert.ToDateTime(reader.ReadLine()); ?

Добавлено через 27 секунд
Сделал так теперь у меня в листбоксе пусто стало =(
0
I2um1
Злой няш
1413 / 1111 / 374
Регистрация: 05.04.2010
Сообщений: 1,949
07.05.2012, 14:01 20
Цитата Сообщение от 3a9Iac Посмотреть сообщение
record.Date = Convert.ToDateTime(reader.ReadLine()); ?
Пример

Цитата Сообщение от 3a9Iac Посмотреть сообщение
Сделал так теперь у меня в листбоксе пусто стало =(
Для этого был придуман Debug.
1
07.05.2012, 14:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.05.2012, 14:01

Принцип сортировки в Enumerable.OrderBy и Array.Sort
Здравствуйте! Подскажите, пожалуйста, почему при сортировке одного и того же массива num() типа int...

Как правильно использовать sort() для сортировки массива?
Хочу отсортировать массив char ch, можно ли это сделать с помощью стандартной библиотеки или...

Как использовать .sort() для сортировки массива объектов по определенному свойству?
Как использовать .sort() для сортировки массива объектов по определенному общему свойству?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru