Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.81/47: Рейтинг темы: голосов - 47, средняя оценка - 4.81
11 / 11 / 3
Регистрация: 16.10.2012
Сообщений: 139

Создать индексатор, позволяющий по индексу 0 обращаться к полю R, по индексу 1 — к полю text

28.06.2013, 10:07. Показов 9849. Ответов 45
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Стоит задача: создать "индексатор, позволяющий по индексу 0 обращаться к полю R, по индексу 1 - к полю text"
Но! R - Regex, text - string;
Поломал себе голову на.прочь. Попробовал в лоб:
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
        public Regex this[int i]
        {
            set
            {
                switch (i)
                {
                    case 0:
                        this.R = value;
                        break;
 
                    default:
                        throw new IndexOutOfRangeException();
                }
            }
 
 
            get
            {
                switch (i)
                {
                    case 0:
                        return this.R;
                        break;
 
 
                    default:
                        throw new IndexOutOfRangeException();
                }
            }
        }
   
 
        public string this[int i]
        {
            set
            {
                switch (i)
                {
                    case 1:
                        this.text = value;
                        break;
 
                    default:
                        throw new IndexOutOfRangeException();
                }
            }
 
 
            get
            {
                switch (i)
                {
                    case 1:
                        return this.text;
                        break;
 
                    default:
                        throw new IndexOutOfRangeException();
                }
            }
        }
Естественно выдаётся ошибка:
already defines a member called 'this' with the same parameter types
Сейчас читаю про перегрузку индексаторов и класс Object. Возможно это чем-то сможет помочь. Но пока без результата. Так как всё-таки правильно поступить в этой ситуации?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.06.2013, 10:07
Ответы с готовыми решениями:

В класс Rectangle добавить индексатор, позволяющий по индексу 0 обращаться к полю a, по индексу 1 – к полю b
Уважаемые форумчане подскажите с задание. вот задание: заранее спасибо! Добавлено через 20 часов 27 минут кто нибудь???

В класс Money добавить индексатор, позволяющий по индексу 0 обращаться к полю first
В класс Money добавить: a. Индексатор, позволяющий по индексу 0 обращаться к полю first, по индексу 1 – к полю second, при других...

Класс: Добавить в класс "Строка" индексатор, позволяющий по индексу обращаться к соответствующему символу строки.
Добавить в класс для работы сo строками: a. Индексатор, позволяющий по индексу обращаться к соответствующему символу строки. b....

45
 Аватар для IamRain
4695 / 2702 / 735
Регистрация: 02.08.2011
Сообщений: 7,236
29.06.2013, 09:28
Студворк — интернет-сервис помощи студентам
Преобразование к тому типу или из того, в котором определен этот оператор - в твоем случае RegExp must be.
1
11 / 11 / 3
Регистрация: 16.10.2012
Сообщений: 139
29.06.2013, 09:37  [ТС]
Цитата Сообщение от IamRain Посмотреть сообщение
Преобразование к тому типу или из того, в котором определен этот оператор - в твоем случае RegExp must be.
Опять туплю. Не затруднит показать в коде?
0
 Аватар для IamRain
4695 / 2702 / 735
Регистрация: 02.08.2011
Сообщений: 7,236
29.06.2013, 09:42
Просто напишите два метода, которые будут конвертировать в одну и в другую сторону.

Добавлено через 1 минуту
Тот же самый код, только в методах.
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
29.06.2013, 14:25
@AlexanderWM,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        public object this[int i]
        {
 
            set {
              
                var result = CheckType(i);
                    if (result.GetType() == typeof(Regex)){
                    //вариант set для регекса
                    R = (Regex)value;  
                }
                else{
                //вариант set для стринга
                text = value; 
                } 
            }
смысл приводить object к чему-то еще, а потом обратно к object?
надо было сделать так
индексатор, позволяющий по индексу 0 обращаться к полю R, по индексу 1 - к полю text
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public object this[int i]
{
   get
   {
   if (i == 0)
      return R;
   if (i == 1)
      return text;
   throw new ArgumentException(i);
   }
   set
   {
   if (i == 0)
      R = value;
   if (i == 1)
      text = value;
   throw new ArgumentException(i);
   }
}
1
11 / 11 / 3
Регистрация: 16.10.2012
Сообщений: 139
04.07.2013, 10:15  [ТС]
Цитата Сообщение от IamRain Посмотреть сообщение
Преобразование к тому типу или из того, в котором определен этот оператор - в твоем случае RegExp must be.
Ок. Пишу так. И вроде всё нормально.
C#
1
2
3
4
5
6
7
8
9
public static explicit operator string(RegExp r){
 
return r.ToString();
}
 
public static implicit operator Regex(RegExp text){
 
return (Regex)text;
}
Но возникают неясности при использовании:

C#
1
2
3
4
5
6
7
8
9
10
11
...
RegExp My = new RegExp(pattern, text);
           
Console.WriteLine("Пример преобразования класса Regex в тип string (и наоборот)\n");
 
string converted = (string) My;
Console.WriteLine(converted);
 
 
string regular = @"string with regular";
regular= (Regex)regular;
Во втором случае пишет, что не удаётся сконвертировать string в Regex.
Как поступить?
0
644 / 198 / 5
Регистрация: 24.07.2010
Сообщений: 1,315
04.07.2013, 11:03
Так правильно

Цитата Сообщение от AlexanderWM Посмотреть сообщение
C#
1
2
string regular = @"string with regular";
regular= (Regex)regular;
ты что тут пытаешься сделать? создаешь переменную типа стринг, а затем пытаешься в нее записать переменную типа Regex, попробуй так:

C#
1
2
string regularString = @"string with regular";
Regex newRegular= (Regex)regularString ;
Добавлено через 6 минут
Цитата Сообщение от AlexanderWM Посмотреть сообщение
C#
1
2
3
public static implicit operator Regex(RegExp text){
return (Regex)text;
}
Плюс я сомневаюсь, что получится сделать так, наверно там надо заменить на

C#
1
return new Regex(text);
1
11 / 11 / 3
Регистрация: 16.10.2012
Сообщений: 139
04.07.2013, 11:15  [ТС]
Цитата Сообщение от 23Alex24 Посмотреть сообщение
Плюс я сомневаюсь, что получится сделать так, наверно там надо заменить на
C#
1
return new Regex(text);
Тогда возникает ошибка
The best overloaded method match for 'System.Text.RegularExpressions.Regex.Re gex(string)' has some invalid arguments
0
644 / 198 / 5
Регистрация: 24.07.2010
Сообщений: 1,315
04.07.2013, 11:31
Сейчас поглядимс, а, ну там ексепшн в случае, если строка пустая оказывается, ну тогда можно сделать так:

C#
1
2
3
4
5
if(string.IsNullOrWhiteSpace(text))
{
return new Regex();
}
else return new Regex(text);
попробуй так =)

Добавлено через 1 минуту
И если какая-то ошибка будет, кинь кусочек кода для public static implicit operator Regex(RegExp text)
1
11 / 11 / 3
Регистрация: 16.10.2012
Сообщений: 139
04.07.2013, 11:37  [ТС]
Ох...
Error 1 The best overloaded method match for 'string.IsNullOrWhiteSpace(string)' has some invalid arguments
Error 6 Cannot convert type 'string' to 'System.Text.RegularExpressions.Regex'
Error 2 Argument 1: cannot convert from 'MyNameSpace.RegExp' to 'string'
Error 5 Argument 1: cannot convert from 'MyNameSpace.RegExp' to 'string'
Error 3 'System.Text.RegularExpressions.Regex.Re gex()' is inaccessible due to its protection level
А если вообще абстрагироваться от моего кода и просто решить задачу. Как должен выглядеть перевод string в Regex?
0
644 / 198 / 5
Регистрация: 24.07.2010
Сообщений: 1,315
04.07.2013, 11:44
Кинь кусок кода то =) public static implicit operator Regex(RegExp text) и тот, где пытаешься сконвертить

Добавлено через 4 минуты
Только сейчас заметил =))

вот это:
C#
1
public static implicit operator Regex(RegExp text)
надо заменить на вот это:
C#
1
public static implicit operator Regex(string text)
Добавлено через 1 минуту
а вот это:

public static explicit operator string(RegExp r)

на вот это:

C#
1
public static explicit operator string(Regex r)
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
04.07.2013, 11:52
C#
1
2
3
4
public static implicit operator Regex(RegExp text){
 
return (Regex)text;
}
это вообще какая-то рекурсия по-моему
2
11 / 11 / 3
Регистрация: 16.10.2012
Сообщений: 139
04.07.2013, 11:53  [ТС]
Цитата Сообщение от 23Alex24 Посмотреть сообщение
Только сейчас заметил =))

вот это:
C#
1
public static implicit operator Regex(RegExp text)
надо заменить на вот это:
C#
1
public static implicit operator Regex(string text)
А нельзя так. Я пробовал кучу раз. Дело в том, что:
Определенное пользователем преобразование должно осуществлять преобразование в данный включающий тип или из данного включающего типа
(http://msdn.microsoft.com/ru-r... 90%29.aspx)
0
644 / 198 / 5
Регистрация: 24.07.2010
Сообщений: 1,315
04.07.2013, 12:48
Эх, придется проверять, щас поглядим =)

Добавлено через 27 минут
Покопался, покопался, вроде более менее понял, значит смотри какая штука - такие операторы преобразования можно описывать только внутри класса, и только для типа этого класса, то есть допустим есть у тебя класс TEST, вот для него, ты внутри этого класса можешь описать оператор преобразования, причем только в одну сторону, например ИЗ переменной типа TEST в любой другой тип, наоборот нельзя(из переменной любого типа в тип TEST)

Если я правильно понял конечно, может кто-то поправит, то есть получается ты не можешь для стандартных типов сделать операторы конвертирования( для конвертирования из стринга в Regex и наоборот), конечно можно попробывать описать методы расширения, но это будут именно методы, там уже явным преобразованием не получится сконвертить
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
04.07.2013, 12:50
Цитата Сообщение от 23Alex24 Посмотреть сообщение
допустим есть у тебя класс TEST, вот для него, ты внутри этого класса можешь описать оператор преобразования, причем только в одну сторону, например ИЗ переменной типа TEST в любой другой тип, наоборот нельзя(из переменной любого типа в тип TEST)
неверно, наоборот тоже можно.
1
644 / 198 / 5
Регистрация: 24.07.2010
Сообщений: 1,315
04.07.2013, 12:54
Цитата Сообщение от Psilon Посмотреть сообщение
неверно, наоборот тоже можно.
А, ну да, наверно можно, но там получается, что как бы мы этот оператор преобразования должны обязательно описать внутри класса верно? то есть скажем если бы мы хотели, чтобы был оператор преобразования для string и regex, то нам бы потребовалось в одном из этих классов описать этот оператор преобразования, правильно?

Добавлено через 1 минуту
И еще я вроде попытался описать оператор преобразование как метод расширения, но у меня ничего не получилось, это наверно невозможно?)
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
04.07.2013, 12:55
23Alex24, то есть если мы имеем класс T, то мы можем определить преобразование
либо Anything -> T, либо T -> Anything,
а преобразование A->B внутри класса T мы определить не можем.
1
644 / 198 / 5
Регистрация: 24.07.2010
Сообщений: 1,315
04.07.2013, 13:10
Ага, все, понял, получается для преобразования string в regex нам бы понадобилось описать оператор преобразования либо в классе string, либо в классе regex. Но у нас ведь нет возможности править стандартные классы, а через методы расширения как я понял не получится описать оператор преобразования да?

Добавлено через 9 минут
Еще бы наверно как вариант если допустимо, можно было бы унаследоваться от нужного класса и попробывать у него переопределить операторы конвертирования, но этот вариант тоже не подходит в данном случае
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
04.07.2013, 13:14
Цитата Сообщение от 23Alex24 Посмотреть сообщение
Ага, все, понял, получается для преобразования string в regex нам бы понадобилось описать оператор преобразования либо в классе string, либо в классе regex. Но у нас ведь нет возможности править стандартные классы, а через методы расширения как я понял не получится описать оператор преобразования

Еще бы наверно как вариант если допустимо, можно было бы унаследоваться от нужного класса и попробывать у него переопределить операторы конвертирования, но этот вариант тоже не подходит в данном случае
т.к. большинство системных классов sealed. Так что
1
644 / 198 / 5
Регистрация: 24.07.2010
Сообщений: 1,315
04.07.2013, 13:16
а стоп, что-то меня не в ту степь понесло =) у тебя правильно было все вначале, тупимс тупимс =))

В общем напиши так:
C#
1
public static implicit operator string(RegExp text)
C#
1
public static implicit operator RegExp(stringtext)
вот =)У него же как раз "класс для работы с регулярными выражениями", то есть нам и не нужно из string в Regex или наоборот, у нас есть же описанный RegExp
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
04.07.2013, 13:16
23Alex24,
а стоп, что-то меня не в ту степь понесло =) у тебя правильно было все вначале, тупимс тупимс =))
да
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.07.2013, 13:16

Обратиться к полю таблицы по индексу
Доброго времени суток всем. Что-то заклинило. Гугл подсказал как получить список таблиц базы и как получить список полей таблицы. А мне...

Обращаться к списку по индексу
Хочу вообщем, чтобы обращаясь к какому-нибудь элементу по индексу получать доступ сразу к какому-то списку, не переходя постоянно между...

Можно ли обращаться к TextBox по индексу
Здравствуйте люди добрые!!! Помогите!!! У меня есть "почти" рабочий код: 1. Default.aspx <asp:Repeater...

Как обращаться к своему классу по индексу?
Люди помогите пожалуйста :cry: как мне сделать чтоб бы можно было в параметры моего нового контрола вбивать сразу для удобства несколько...

[Двусвязные списки] Добавление по индексу. Взятие адреса по индексу
По заданию требуется: 1) Создать функцию void Insert(Person& person, int index), помещающую переменную типа Person по указанному...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru