Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/29: Рейтинг темы: голосов - 29, средняя оценка - 4.90
2 / 2 / 0
Регистрация: 16.04.2015
Сообщений: 73

IndexOf в коллекции объектов

14.11.2015, 23:14. Показов 6221. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не могу понять почему IndexOf не видит объект в коллекции. Почему первая проверка не замечает повторяющихся объектов в списке, а вторая проверка видит повторяющиеся строки в коллекции?

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
public class Logic
    {
        private List<Company> list_of_companies = new List<Company>();
        private List<string> names_list = new List<string>();
        private List<string> all_lines_articles = new List<string>();
        public void Create_all_lines()
        {
            all_lines_articles.Add("** Lastochka");
            all_lines_articles.Add("** Basilio");
            all_lines_articles.Add("** Alisa");
            all_lines_articles.Add("** Karabas");
            all_lines_articles.Add("** Barabas");
            all_lines_articles.Add("** Basilio");
            all_lines_articles.Add("** Buratino");
            all_lines_articles.Add("** Alisa");
            all_lines_articles.Add("** Barabas");
            all_lines_articles.Add("** Buratino");
            all_lines_articles.Add("** Lastochka");
        }
        public void Set_company_list()
        {
            foreach (string line in all_lines_articles)
            {
                if (line.StartsWith("**"))
                {
                    string company_name = line.Substring(2, line.Length - 2);
                    Company company = new Company(company_name);
                    int index_of_company = list_of_companies.IndexOf(company);
                    if (index_of_company == -1)
                    {
                        list_of_companies.Add(company);
                    }
                }
            }
        }
        public void Set_names_list()
        {
            foreach (string line in all_lines_articles)
            {
                if (line.StartsWith("**"))
                {
                    string company_name = line.Substring(2, line.Length - 2);
                    int index_of_name = names_list.IndexOf(company_name);
                    if (index_of_name == -1)
                    {
                        names_list.Add(company_name);
                    }
                }
            }
        }
    }
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.11.2015, 23:14
Ответы с готовыми решениями:

Подсчет количества элементов каждого вида в коллекции. IndexOf ВСЕГДА возвращает -1
Есть коллекция: List&lt;MyClass&gt; list = ...; (MyClass описан в предыдущей моей теме в этом разделе.) Пытаюсь подсчитать частоту каждой...

В чем разница данных методов IndexOf и IndexOf<>
Доброго времени суток. Подскажите пожалуйста в чем отличие методов с символами &lt;&gt; и без них ?

Создание коллекции объектов
List&lt;object&gt; Argo = new List&lt;object&gt;(); Argo.Add(SendKeys.Send(&quot;{TAB}&quot;)); Ошибка 2 Аргумент &quot;1&quot;: преобразование типа из...

6
548 / 355 / 120
Регистрация: 17.08.2014
Сообщений: 1,351
14.11.2015, 23:49
Я думаю потому что в первом случае вы ищете индекс у объекта коллекции, хотя в этом списке все объекты одинаковые и какой ищете вы непонятно.
Цитата Сообщение от manumozz Посмотреть сообщение
C#
1
2
Company company = new Company(company_name);
* * * * * * * * * * int index_of_company = list_of_companies.IndexOf(company);
0
2 / 2 / 0
Регистрация: 16.04.2015
Сообщений: 73
15.11.2015, 00:10  [ТС]
Что значит одинаковые? У каждого есть поле имени и они содержат разные значения. Как работает IndexOf? Он сравнивает поля объектов?
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
15.11.2015, 00:58
Лучший ответ Сообщение было отмечено manumozz как решение

Решение

IndexOf в случае со ссылочными типами проверяет, не состоит ли данный объект в коллекции. В первый раз вы создаете новый объект класса Company(классы-ссылочный тип) и пытаетесь искать ее списке объектов, он ищет ссылку на этот самый новый объект и, понятное дело, не находит там ее, потому что ее там нет. Значения полей он не проверяет. В случае же с типами, передающимися по значению(Структуры и примитивные типы вроде int,double. string тоже передается по значению, хоть он вроде как и считается классом), он сравнивает именно значения. Соответственно, когда вы ищите этим методом по коллекции строк, то он уже проверяет их значения, а потому и все находит успешно.

Добавлено через 7 минут
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
using System;
using System.Collections.Generic;
 
namespace ConsoleApplication51
{
    class Program
    {
        struct TestStruct
        {
            public int first;
            public int second;
        }
        class TestObject
        {
            public int first;
            public int second;
        }
        static void Main(string[] args)
        {
            List<TestObject> lso = new List<TestObject>() { new TestObject() { first = 1, second = 2 }, new TestObject() { first = 4, second = 2 }, new TestObject() { first = 7, second = 2 } };
            List<TestStruct> lss = new List<TestStruct>() { new TestStruct() { first = 1, second = 2 }, new TestStruct() { first = 4, second = 2 }, new TestStruct() { first = 8, second = 2 } };
            Console.WriteLine(lso.IndexOf(new TestObject { first = 4, second = 2 })); //это выведет -1
            Console.WriteLine(lss.IndexOf(new TestStruct { first = 4, second = 2 })); //а это 1
            Console.Read();
        }
    }
}
1
1167 / 885 / 517
Регистрация: 09.04.2014
Сообщений: 2,101
15.11.2015, 13:27
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public void Set_company_list()
        {
            foreach (string line in all_lines_articles)
            {
                if (line.StartsWith("**"))
                {
                    string company_name = line.Substring(2, line.Length - 2);
                    int index_of_company = list_of_companies.FindIndex(x=> x.Name == company_name);
                    if (index_of_company == -1)
                    {
                        Company company = new Company(company_name);
                        list_of_companies.Add(company);
                    }
                }
            }
        }
1
2 / 2 / 0
Регистрация: 16.04.2015
Сообщений: 73
19.11.2015, 14:53  [ТС]
что это за код?
C#
1
(x => x.Name == company_name)
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
19.11.2015, 15:20
Цитата Сообщение от manumozz Посмотреть сообщение
что это за код?
Это LINQ+лямба выражение. В данном случае вот это:
C#
1
list_of_companies.FindIndex(x=> x.Name == company_name);
Вернет индекс компании в списке, у которой свойство Name равно значению переменной company_name.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.11.2015, 15:20
Помогаю со студенческими работами здесь

Классы, коллекции объектов
Всем привет, такое задание в лабораторной работе : &quot;реализовали класс, внутри которого есть массив object'ов(в пределах иерархии,...

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

Коллекции объектов и вложенные классы
Подскажите - как сделать коллекции? Ну или вложенные объекты. Например objetcs(1).mainobject.text.color Как это реализуется в ручную?...

Сортировка коллекции объектов обобщенного класса
Доброго времени суток) Столкнулся с такой проблемой: не получается отсортировать коллекцию. Необходимо, чтобы коллекция объектов...

Сортировка коллекции объектов обобщенного класса
Доброго времени суток) Столкнулся с такой проблемой: не получается отсортировать коллекцию. Необходимо, чтобы коллекция объектов...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru