Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
1 / 1 / 0
Регистрация: 09.03.2018
Сообщений: 50
1
.NET 6

Отсортировать объекты класса

30.05.2022, 20:20. Показов 203. Ответов 1

Author24 — интернет-сервис помощи студентам
Добрый день! Пишу программку на формах. Столкнулся с такой проблемой:

Есть класс, который заполняется из xml файла через другой класс, который является держателем объектов этого.. Если так можно сказать..
Собственно, хотелось бы подсказки, как можно работать с объектами? К примеру, отсортировать массив в порядке убывания по какому-то полю и т.д.
Работать с классами буду в коде формочки.. Накидайте простенький пример, как к примеру массив отсортировать по дате или вывести в textbox только элементы с нужным названием..

Класс внутренний:

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
using System;
using System.Xml;
 
namespace budBuild
{
    public class Orders
    {
        public int number;
        public int day;
        public int month;
        public int year;
        public string name;
        public int weight;
        public string point;
        public string car;
        public string done;
 
        public Orders(int number, int day, int month, int year, string name, int weight, string point, string car, string done)
        {
            this.number = number;
            this.day = day;
            this.month = month;
            this.year = year;
            this.name = name;
            this.weight = weight;
            this.point = point;
            this.car = car;
            this.done = done;
        }
    }
}
Внешний:

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
using System;
using System.Collections.Generic;
using System.Xml;
 namespace budBuild.Models
{
    class Lists
    {
        public List<Orders> OrderList
        {
            get
            {
                List<Orders> orders = new List<Orders>();
                XmlDocument xml = new XmlDocument();
                xml.Load(@"../../Data/fileList.xml");
                XmlNode root = xml.DocumentElement;
                for(int i = 0; i < root.ChildNodes.Count; i++)
                {
                    Orders or = new Orders(
                    int.Parse(root.ChildNodes[i].ChildNodes[0].InnerText),
                    int.Parse(root.ChildNodes[i].ChildNodes[1].InnerText),
                    int.Parse(root.ChildNodes[i].ChildNodes[2].InnerText),
                    int.Parse(root.ChildNodes[i].ChildNodes[3].InnerText),
                    root.ChildNodes[i].ChildNodes[4].InnerText,
                    int.Parse(root.ChildNodes[i].ChildNodes[5].InnerText),
                    root.ChildNodes[i].ChildNodes[6].InnerText,
                    root.ChildNodes[i].ChildNodes[7].InnerText,
                    root.ChildNodes[i].ChildNodes[8].InnerText
                    );
                    orders.Add(or);
                }
                return orders;
            }
        }
    }
}

xml:
XML
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
57
58
<?xml version="1.0"?>
<allorders>
    <order>
        <number>7261</number>
        <day>19</day>
        <month>05</month>
        <year>2022</year>
        <name>Glass</name>
        <weight>2000</weight>
        <point>Kiev</point>
        <car>AE2821LK</car>
        <done>Yes</done>
    </order>
    <order>
        <number>261</number>
        <day>19</day>
        <month>09</month>
        <year>2022</year>
        <name>Cow</name>
        <weight>9000</weight>
        <point>Poltava</point>
        <car>AH211LK</car>
        <done>No</done>
    </order>
    <order>
        <number>381</number>
        <day>16</day>
        <month>07</month>
        <year>2022</year>
        <name>Iron</name>
        <weight>200210</weight>
        <point>Kiev</point>
        <car>AE2221LK</car>
        <done>Yes</done>
    </order>
    <order>
        <number>8192</number>
        <day>19</day>
        <month>09</month>
        <year>2022</year>
        <name>Food</name>
        <weight>100</weight>
        <point>Grass</point>
        <car>AW21LK</car>
        <done>No</done>
    </order>
    <order>
        <number>92918</number>
        <day>19</day>
        <month>01</month>
        <year>2022</year>
        <name>Glass</name>
        <weight>600</weight>
        <point>Kiev</point>
        <car>AE2821LK</car>
        <done>Yes</done>
    </order>
</allorders>
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.05.2022, 20:20
Ответы с готовыми решениями:

Где размещать объявления класса, чтобы объекты этого класса можно объявлять в нескольких Form
Вопрос тупой. Так получилось, что надо написать прогу в Visual C# вместо билдера. Где размещать...

Сортировка: Как отсортировать объекты конечных классов с учетом промежуточного базового класса?
Есть один базовый класс (ClassMain), который наследует три класса (N1 N2 N3), каждый из трех...

Что за объекты внутри класса с типом этого же класса?
Заметил такую вещь, что в некоторых примерах кода внутри класса создается переменная с типом этого...

Реализация класса с свойствами - ссылками на объекты класса
Всем привет, пожалуйста подскажите реализацию такой интересной вещи, что написана в заголовке. Вот...

1
8940 / 4852 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
30.05.2022, 22:48 2
Во-первых, для отображения набора данных есть специальные контролы. Например, DataGridView.
Во-вторых. Если есть такое представление в XML, то нужно использовать сериализацию. Из XML сгенерировать классы, например здесь.
Классы
C#
1
2
3
4
5
6
7
8
9
10
11
12
using System;
using System.Xml.Serialization;
using System.Collections.Generic;
namespace Sorting
{
    [XmlRoot(ElementName = "allorders")]
    public class AllOrders
    {
        [XmlElement(ElementName = "order")]
        public List<Order> Order { get; set; }
    }
}
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
using System.Xml.Serialization;
namespace Sorting
{
    [XmlRoot(ElementName = "order")]
    public class Order
    {
        [XmlElement(ElementName = "car")]
        public string Car { get; set; }
        [XmlElement(ElementName = "day")]
        public string Day { get; set; }
        [XmlElement(ElementName = "done")]
        public string Done { get; set; }
        [XmlElement(ElementName = "month")]
        public string Month { get; set; }
        [XmlElement(ElementName = "name")]
        public string Name { get; set; }
        [XmlElement(ElementName = "number")]
        public string Number { get; set; }
        [XmlElement(ElementName = "point")]
        public string Point { get; set; }
        [XmlElement(ElementName = "weight")]
        public string Weight { get; set; }
        [XmlElement(ElementName = "year")]
        public string Year { get; set; }
    }
}

Затем сериализуем:
C#
1
2
3
4
5
6
7
AllOrders orders;
var s = new XmlSerializer(typeof(AllOrders));
using (StreamReader sr = new StreamReader("Orders.xml"))
{
    orders = s.Deserialize(sr) as AllOrders;
 
}
В-третьих. Поскольку нам нужна сортировка и фильтрация, то нужно использовать DataTable. Для этого наши данные нужно преобразовать в неё. Не тривиальная задача, но легко гуглится
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
public static class Helpers
{
    public static DataTable ToDataTable<T>(this IEnumerable<T> list)
    {
        var type = typeof(T);
        var properties = type.GetProperties();
 
        var dataTable = new DataTable();
        dataTable.TableName = typeof(T).FullName;
        foreach (var info in properties)
        {
            dataTable.Columns.Add(new DataColumn(info.Name, Nullable.GetUnderlyingType(info.PropertyType) ?? info.PropertyType));
        }
 
        foreach (T entity in list)
        {
            var values = new object[properties.Length];
            for (int i = 0; i < properties.Length; i++)
            {
                values[i] = properties[i].GetValue(entity);
            }
 
            dataTable.Rows.Add(values);
        }
 
        return dataTable;
    }
}
Осталось всё связать. DataGridView для отображения данных, BindingSource для сортировки и фильтрации, ComboBox для выбора поля, по которому фильтровать, TextBox для ввода текста. Фильтруем так:
C#
1
2
3
4
5
6
7
8
9
10
private void txtFilter_TextChanged(object sender, EventArgs e)
{
    if (txtFilter.Text.Length == 0)
    {
        bindingSource1.Filter = String.Empty;
        return;
    }
    var name = (cmdColumnName.SelectedItem as DataColumn).ColumnName;
    bindingSource1.Filter = $"{name} like '*{txtFilter.Text}*'";
}
Пример во вложении.
Вложения
Тип файла: zip Sorting.zip (8.0 Кб, 0 просмотров)
0
30.05.2022, 22:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.05.2022, 22:48
Помогаю со студенческими работами здесь

Объекты класса
Допустим , понадобилось создать 4-е объекта VkApi, как это правильно реализовать? for(int i =...

Объекты класса в делегатах
Я начал недавно изучать делегаты и столкнулся со следующей проблемой. Это правда, что нельзя в...

Перегрузка операции + с преобразованием объектов одного класса в объекты другого класса
Доброго времени суток! Изучаю ООП, при выполнении следующего задания возникли сложности: Создать...

Можно ли объявлять в описании одного класса объекты другого класса
Здравствуйте! Помогите, пожалуйста, разобраться: я описал класс SignalZakon, а теперь хочу создать...

С++ Создать в качестве поля одного класса список указателей на объекты другого класса
#pragma once #include &lt;list&gt; ref class ObjectOnMap; ref class Map { private: int...

Поместить в динамически расширяемый массив объекты класса, производные от базового абстрактного класса
Помогите пожалуйста новичку! (мне). Я хочу создать динамически расширяющийся массив указателей...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru