Форум программистов, компьютерный форум, киберфорум
LINQ
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
8 / 8 / 6
Регистрация: 02.04.2014
Сообщений: 62
1

LINQ запрос к DictionaryBase

10.06.2015, 13:27. Показов 1331. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
запрос к Dictionary работает:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Dictionary<string, string> cd;
cd = new Dictionary<string, string>();
cd.Add("0", "zero");
cd.Add("1", "one");
cd.Add("2", "two");
cd.Add("3", "three");
cd.Add("4", "four");
 
var Инфо =
  from entry in cd
  select entry.Value;
 
foreach (var элем in Инфо)
{
  Console.WriteLine(элем);
}
мне в лабе нужно сделать также но к DictionaryBase
никак не получается
вот используемые классы:
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Зад_3
{
    public class DictionaryBase1 : DictionaryBase
    {
        // конструктор по умолчанию
        public DictionaryBase1()
        {
        }
 
        // добавление в конец коллекции
        public void Add(string Идентификатор, ВодныйТранспорт транспорт)
        {
            Dictionary.Add(Идентификатор, транспорт);
        }
 
        // удаление из коллекции
        public void Remove(string Идентификатор)
        {
            Dictionary.Remove(Идентификатор);
        }
 
        // индексатор
        public ВодныйТранспорт this[string ключ]
        {
            get { return (ВодныйТранспорт)Dictionary[ключ]; }
            set { Dictionary[ключ] = value; }
        }
 
        // нумератор
        public new IEnumerator GetEnumerator()
        {
            foreach (object транспорт in Dictionary.Values)
                yield return (ВодныйТранспорт)транспорт;
        }
    }
 
    public class DictionaryBase1 : DictionaryBase
    {
        // конструктор по умолчанию
        public DictionaryBase1()
        {
        }
 
        // добавление в конец коллекции
        public void Add(string Идентификатор, ВодныйТранспорт транспорт)
        {
            Dictionary.Add(Идентификатор, транспорт);
        }
 
        // удаление из коллекции
        public void Remove(string Идентификатор)
        {
            Dictionary.Remove(Идентификатор);
        }
 
        // индексатор
        public ВодныйТранспорт this[string ключ]
        {
            get { return (ВодныйТранспорт)Dictionary[ключ]; }
            set { Dictionary[ключ] = value; }
        }
 
        // нумератор
        public new IEnumerator GetEnumerator()
        {
            foreach (object транспорт in Dictionary.Values)
                yield return (ВодныйТранспорт)транспорт;
        }
    }
 
    // Абстрактный класс ВодныйТранспорт
    public abstract class ВодныйТранспорт
    {
        // поля
        public string Наименование { get; set; }
        public double Скорость { get; set; }
 
        // конструктор по умолчанию
        public ВодныйТранспорт()
        {
        }
 
        // перегруженный конструктор
        public ВодныйТранспорт(string наименование, double скорость)
        {
            Наименование = наименование;
            Скорость = скорость;
        }
 
        // строковое представление объекта
        public override string ToString()
        {
            return string.Format("Наименование: {0}, Скорость: {1} км/ч",
                Наименование, Скорость);
        }
 
        // метод
        public void ПриходВПорт()
        {
            Console.WriteLine("{0} прибыл в порт.", Наименование);
        }
    }
 
    
    // Класс Авианосец, производный от ВодныйТранспорт
    public class Авианосец : ВодныйТранспорт
    {
        // собственные поля
        public double КоличествоСамолетов { get; set; }
 
        // конструктор
        public Авианосец(string наименование, double скорость, double количество_самолетов)
            : base(наименование, скорость)
        {
            КоличествоСамолетов = количество_самолетов;
        }
 
        // собственные методы
        public void ВзлетАвианосца()
        {
            Console.WriteLine("Авианосец взлетел.");
        }
    }
 
 
    // Класс Танкер, производный от ВодныйТранспорт
    public class Танкер : ВодныйТранспорт
    {
        // собственные поля
        public double Объем { get; set; }
 
        // конструктор
        public Танкер(string наименование, double скорость, double объем)
            : base(наименование, скорость)
        {
            Объем = объем;
        }
 
        // собственные методы
        public void ЗагрузкаТанкера()
        {
            Console.WriteLine("Танкер загружен.");
        }
    }
}
пытаюсь так:
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
class Program
{
static void Main(string[] args)
{
DictionaryBase1 colBase = new DictionaryBase1();
 
// добавляем объекты в коллекцию
// ключ = имя
colBase.Add("Авианосец-1", new Авианосец("Авианосец-1", 100, 100));
colBase.Add("Авианосец-2", new Авианосец("Авианосец-2", 200, 200));
colBase.Add("Танкер-1", new Танкер("Танкер-1", 10, 100));
colBase.Add("Танкер-2", new Танкер("Танкер-2", 20, 200));
 
// вот обычный вывод работает
int ind = 0;
foreach (ВодныйТранспорт транспорт in colBase)
{
    // выводим свойства объектов
    Console.Write("\n {0}) {1}, Скорость {2} км/ч", ind, транспорт.Наименование, транспорт.Скорость);
    // если это авиалайнер выводим его количество самолетов
    if (транспорт is Авианосец)
    {
        Console.Write(", Cамолетов {0} шт", (транспорт as Авианосец).КоличествоСамолетов);
    }
 
    // если это танкер выводим его объем
    if (транспорт is Танкер)
    {
        Console.Write(", Объем {0} м3", (транспорт as Танкер).Объем);
    }
    ind++;
}
 
// а вот тут засада (
// LINQ-запрос к коллекции и вывод ее на экран
 
var Инфо =
  from ВодныйТранспорт элемент in colBase
  select элемент;
 
foreach (var транспорт in Инфо) // <-- здесь уже выдает ошибку приведения 
{
    var тр = транспорт.ToString();
}
}
на операторе foreach выдает:
Не удалось привести тип объекта "System.Collections.DictionaryEntry" к типу "Зад_3.ВодныйТранспорт".

как мне используя LINQ вывести все элементы коллекции colBase

p.s.
помогите, ибо горю - срочно нужно лабу сдавать, а теорию внимательно уж и некогда читать
а во всех самых популярных книгах примеров LINQ с DictionaryBase то и не увидел
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.06.2015, 13:27
Ответы с готовыми решениями:

Переписать SQL запрос в LINQ запрос
День добрый всем. Подскажите, пожалуйста, как можно преобразовать запрос: SELECT Price *...

Написать LINQ-запрос
Имеется SQL-запрос. Помогите написать LINQ select a.AbonentID, e.PeriodBegin, e.PeriodEnd,...

LINQ запрос с подзапросом
Ребята, подскажите - как можно выполнить вложенный запрос в основном LINQ запросе? ...

Создать LINQ запрос
Доброго времени суток! Есть форма поиска с тремя полями: Фамилия, имя и отчество. Необходимо...

5
Эксперт .NET
17689 / 12874 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
10.06.2015, 13:50 2
Цитата Сообщение от don_keyhot Посмотреть сообщение
Не удалось привести тип объекта "System.Collections.DictionaryEntry" к типу "Зад_3.ВодныйТранспорт".
Вам же прямым текстом говорят, в чем проблема, почему вы не читаете сообщения об ошибке?
Итератор по словарю возвращает DictionaryEntry, а не ВодныйТранспорт.
В фориче используйте соответствующий тип переменной транспорт и получайте значения по свойствам Key и Value:

C#
1
2
3
4
5
foreach (DictionaryEntry транспорт in colBase)
{
   ...
   транспорт.Value...
}
Добавлено через 2 минуты
Цитата Сообщение от don_keyhot Посмотреть сообщение
C#
1
2
3
4
5
6
7
8
9
10
    if (транспорт is Авианосец)
    {
        Console.Write(", Cамолетов {0} шт", (транспорт as Авианосец).КоличествоСамолетов);
    }
 
    // если это танкер выводим его объем
    if (транспорт is Танкер)
    {
        Console.Write(", Объем {0} м3", (транспорт as Танкер).Объем);
    }
Если задание на наследование и полиморфизм, то такой код будет вам стоить нескольких баллов.
1
746 / 487 / 187
Регистрация: 30.12.2012
Сообщений: 1,278
Записей в блоге: 2
10.06.2015, 13:56 3
Цитата Сообщение от kolorotur Посмотреть сообщение
В фориче используйте соответствующий тип переменной транспорт и получайте значения по свойствам Key и Value:
Я проверил код, там дело не совсем в этом, кажется.

LINQ можно построить так, чтоб заработало:
C#
1
2
3
var Инфо = 
    from DictionaryEntry элемент in colBase
    select элемент.Value;
Прошу прощения, я запутался, все работает
1
8 / 8 / 6
Регистрация: 02.04.2014
Сообщений: 62
10.06.2015, 14:10  [ТС] 4
Tsin, kolorotur,
большое спасибо!
выручил с DictionaryEntry

Добавлено через 3 минуты
kolorotur,
Цитата Сообщение от kolorotur Посмотреть сообщение
такой код будет вам стоить нескольких баллов.
в смысле слишком много is, as?
как это можно улучшить?
0
Эксперт .NET
17689 / 12874 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
10.06.2015, 16:17 5
Цитата Сообщение от don_keyhot Посмотреть сообщение
в смысле слишком много is, as?
Не столько количество, сколько наличие в принципе.
Если у вас в коде встречается примерно такая конструкция:
C#
1
2
3
BaseClass x = ...
if (x is DerivedClass1) ...
else if (x is DerivedClass2) ...
То это признак плохой/хрупкой архитектуры. Что если я добавлю свой класс или вы добавите и забудете обновить код? Ваш код будет его игнорировать.
Здесь напрашивается абстрактный метод в базовом классе (например, GetInfo) и соответствующее его переопределение в наследниках.
0
8 / 8 / 6
Регистрация: 02.04.2014
Сообщений: 62
10.06.2015, 16:27  [ТС] 6
kolorotur, спасибо, ценное замечание! возьму на заметку
ну а счас я просто тороплюсь, времени нет для чистки, сдать лишь бы работало
0
10.06.2015, 16:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.06.2015, 16:27
Помогаю со студенческими работами здесь

SQL запрос в LINQ
Я не понимаю как перобразовать такой SQL-запрос для MS SQL SELECT * FROM sysobjects WHERE type =...

Запрос с группировкой Linq
Доброго времени суток, подскажите как написать вот такой вот запрос на Linq: SELECT pr.Name As...

Запрос с Group By на LINQ
Есть DataTable dt = new DataTable(&quot;index&quot;); dt.Columns.Add(&quot;X&quot;,...

Преобразовать код в LINQ запрос
Добрый вечер. Работаю с Wav файлом и хочу убрать латентный период с помощью LINQ запроса, латентный...

Перевести SQL запрос в LINQ
Доброе время суток! Вот до этого времени не сталкивался с Join в LINQ. Помогите, пожалуйста,...

Почему не работает LINQ запрос?
Подчеркивает APIName в where, не могу понять почему. CS1061 'IAPIName&quot; не содержит определения для...


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

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