Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
430 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,641
Записей в блоге: 14

Убрать из списка классовых объектов те, в которых string_ равно "abcdefgh"

20.02.2019, 21:58. Показов 856. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть класс:
C#
1
2
3
4
5
6
7
8
9
10
11
class MyClass
{
    string string_;
    int n;
 
    MyClass(string new_string, int new_n)
    {
        string_ = new_string;
        n = new_n;
    }
}
Есть список объектов этого класса:
C#
1
List<MyClass> list = ...;
К примеру, { ("aaaaaaaa", 0), ("bbbbbbbb", 9), ("abcdefgh", 65536), ("xyzxyzxy", -273), ("abcdefgh", 999999), ("aaaaaaaa", -365) }. Нужно оставить { ("aaaaaaaa", 0), ("bbbbbbbb", 9), ("mnmnmnmn", -273), ("aaaaaaaa", -365) }. Читал про Linq-методы GroupBy() и Select(), но применимы ли они конкретно в данном случае, не знаю. Список очень длинный, поэтому удалять в цикле недопустимо. Прошу помочь.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.02.2019, 21:58
Ответы с готовыми решениями:

Из списка объектов получить список значений свойств, имя которых (не значение) совпадают с искомой строкой
Пусть есть класс: class Point { public double X { get; set; } public double Y { get;...

Выполнить путём сдвига вправо все биты, значение которых равно нулю и влево все биты, значение которых равно единице
Выполнить путём сдвига вправо все биты, значение которых равно нулю и влево все биты, значение которых равно единице. Как это сделать...

Записать в файл list (очередь) объектов, в которых содержатся строки string, и считать с файла обратно в list
Извините подскажите пожалуйста, как записать list(очередь) объектов в которых содержаться string, и считать с файла обратно в list;...

12
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
21.02.2019, 01:43
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
57
58
59
60
61
62
63
using System;
using System.CodeDom;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Mail;
using System.Net.Sockets;
using System.Runtime.CompilerServices;
using System.Security.Cryptography.X509Certificates;
using System.Text.RegularExpressions;
 
namespace ConsoleApp3
{
    class MyClass:IComparable
    {
        string string_;
        int n;
 
        public MyClass()
        {
                
        }
        public MyClass(string new_string, int new_n)
        {
            string_ = new_string;
            n = new_n;
        }
 
        public override bool Equals(object obj)
        {
            return this.string_.Equals(((MyClass)obj).string_);
        }
 
        public int CompareTo(object obj)
        {
            MyClass localMyClass =obj as MyClass;
            if (localMyClass != null)
            {
                return this.string_.CompareTo(localMyClass.string_);
            }
            else throw new Exception();
        }
 
        public override int GetHashCode()
        {
            return base.GetHashCode();
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
 
        }
    }
}
примерно такой класс создаешь, потом закидываешь в HashSet<>
...
prophit
0
Эксперт .NET
 Аватар для Usaga
14307 / 9388 / 1355
Регистрация: 21.01.2016
Сообщений: 35,405
21.02.2019, 07:21
Etyuhibosecyu, LINQ это тоже цикл, часто даже не один.

Если искать объекты для удаления собираетесь по ключу, то объекты класса MyClass можно затолкать в HashSet<> или Dictionary<>.

Если отсев идёт по условию, то ассоциативные коллекции вам не сильный помощник и можно остаться на List<>.

Если коллекции огромные, то их перебирать можно в параллель. Вариантов много. От ручного с применением Task.Run до Parallel.For и Parallel.ForEach.

Во время перебора коллекции, изменять её нельзя. Придётся или формировать новую из данных, не подпадающих под условия удаления или формировать коллекцию удаляемых элементов, по которой нужно будет снова пройтись, чтобы всё удалить из основной коллекции.

Изменять коллекцию одновременно из разных потоков нельзя (точнее, вам никто не запретит, но вы получите некорректное содержимое такой коллекции). Для таких целей нужны или потокобезопасные коллекции или особые приёмы.
1
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
21.02.2019, 08:54
Usaga,
Цитата Сообщение от Usaga Посмотреть сообщение
Во время перебора коллекции, изменять её нельзя.
хотел добавить. По поводу почему её нельзя менять. В каждой коллекции хранится так называемая её версия (читайте исходники, ТС. Например, посмотрите как реализован Stack.) При любом её изменении версия увеличивается на 1. В перечислителе происходит проверка не равна ли текущая версия коллекции той, которая была при создании перечислителя. Если нет, то выбрасывается исключение.
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
430 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,641
Записей в блоге: 14
21.02.2019, 12:47  [ТС]
Тема актуальна. Diamante, прочитал про HashSet, не получится. Элементы повторяются и должны быть в строгом порядке. Других способов нет? Я уже даже подсказал про GroupBy() и Select(). Весь вопрос в том, что именно туда вводить. Например, я ввел так:
C#
1
list = list.GroupBy(x => x.string_ == "abcdefgh") ...;
- а на месте трех точек не знаю, что вводить. Еще через Ctrl+J заинтересовало Where(), но в Google по этому методу мало что нашел. Никто не подскажет, возможно ли сделать с помощью этих методов?
0
Эксперт .NET
 Аватар для Usaga
14307 / 9388 / 1355
Регистрация: 21.01.2016
Сообщений: 35,405
21.02.2019, 12:51
Etyuhibosecyu, GroupBy вам тут ничем не поможет. Если порядок следования элементов важен, то только List<T> по которому идти в цикле и используя озвученный выше HashSet определять, новый это элемент или уже был. И в зависимости от результат, либо копировать его в новую коллекцию, либо нет.

Есть ещё такой LINQ-метод: Distinct(). Делает всё тоже самое, только в одну строку.
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
430 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,641
Записей в блоге: 14
21.02.2019, 12:55  [ТС]
Usaga, а в него что вводить? Причем мне нужно убрать НЕ повторы, а именно ВСЕ вхождения "abcdefgh".

Добавлено через 2 минуты
И если можно, дайте ссылку на описание с примерами Where(). Что это вообще за метод, как он работает?
0
Эксперт .NET
 Аватар для Usaga
14307 / 9388 / 1355
Регистрация: 21.01.2016
Сообщений: 35,405
21.02.2019, 13:08
Etyuhibosecyu, что в него вводить вы можете увидеть в документации на MSDN.

Если вам нужно убрать все вхождения записей, которые встречаются более одного раза, тогда вам нужно сначала такие записи определить (тут как раз GroupBy подойдёт, с дополнительным условием Count > 1).

А потом создать новую коллекцию наложив на старую LINQ-метод Where в котором проверять каждую запись на наличие в полученной выше коллекции дубликатов.

Добавлено через 10 минут
Etyuhibosecyu, вот возможный вариант решения:

Кликните здесь для просмотра всего текста

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
using System;
using System.Collections.Generic;
using System.Linq;
 
namespace CSrharpApplicationTest
{
    public class MyClass
    {
        public string string_ { get; set; }
        public int n { get; set; }
 
        public MyClass(string s, int n)
        {
            this.string_ = s;
            this.n = n;
        }
    }
 
    public class Program
    {
        public static void Main(string[] args)
        {
            var collection = new List<MyClass>
            {
                new MyClass("aaaaaaaa", 0),
                new MyClass("bbbbbbbb", 9),
                new MyClass("abcdefgh", 65536),
                new MyClass("xyzxyzxy", -273),
                new MyClass("abcdefgh", 999999),
                new MyClass("aaaaaaaa", -365)
            };
 
            var duplicates = collection
                .GroupBy(x => x.string_)
                .Where(x => x.Count() > 1)
                .Select(x => x.Key)
                .ToHashSet();
 
            var newCollection = collection
                .Where(x => !duplicates.Contains(x.string_));
 
            foreach (var v in newCollection)
            {
                Console.WriteLine(v.string_);
            }
 
            Console.ReadKey();
        }
    }
}
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
430 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,641
Записей в блоге: 14
21.02.2019, 13:12  [ТС]
Нет, не вхождения записей, которые встречаются более одного раза, а все вхождения конкретной записи, без разницы, миллион их, одно или ни одного. В шапке указан пример. И все же нашел про Where, сделал так:
C#
1
list = list.Where(x => x.string_ != "abcdefgh").ToList();
Так неправильно?
0
Эксперт .NET
 Аватар для Usaga
14307 / 9388 / 1355
Регистрация: 21.01.2016
Сообщений: 35,405
21.02.2019, 13:17
Etyuhibosecyu, блин. Неужели так сложно было сразу вменяемо описать задачу?

Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Так неправильно?
Правильно. Будет перебор всех строк и отбрасываение не прошедших проверку.
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
430 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,641
Записей в блоге: 14
21.02.2019, 13:21  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Неужели так сложно было сразу вменяемо описать задачу?
Вероятно, у нас разное понимание того, что значит "вменяемо описать". Я это же писал, начиная с шапки.
0
Эксперт .NET
 Аватар для Usaga
14307 / 9388 / 1355
Регистрация: 21.01.2016
Сообщений: 35,405
21.02.2019, 13:23
Etyuhibosecyu, нет. Вы могли написать "отфильтровать коллекцию по условию". А вы показали фрагмент кода и два набора данных и предложили угадать, что изменилось.
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
430 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,641
Записей в блоге: 14
21.02.2019, 13:24  [ТС]
Ладно, спасибо за помощь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.02.2019, 13:24
Помогаю со студенческими работами здесь

Binding списка объектов из другого списка объектов списка
Добрый день. В приложении есть список объектов, в каждом из которых есть ещё список объектов с текстовым свойством. Для примера -...

Вывести все 3х-значные числа, у которых произведение цифр которых равно 48
Вывести все 3х-значные числа, у которых произведение цифр которых равно 48.

функция choose(n:byte; c1: string): string возвращает значение из списка
функция choose(n:byte; c1: string): string возвращает значение из списка, выбранное на основании значения аргумена N. если N=1 то...

Дан массив объектов. Подсчитать количество объектов в массиве, у которых совпадают значения двух полей.
Написать функцию, которая принимает на вход массив объектов. Каждый объект имеет два поля: x и y. Функция должна вернуть количество всех...

Каст классовых типов
#include &lt;iostream&gt; class Cents; class Dollars { int m_dollars; public: Dollars( int m ) : m_dollars( m ) { }...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
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-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru