С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
667 / 264 / 28
Регистрация: 01.06.2018
Сообщений: 3,353
1

Почему read only?

30.11.2020, 17:53. Показов 2704. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
C#
1
2
3
KeyValuePair<string, int>[] a = new KeyValuePair<string, int>[5];
a.Append(new KeyValuePair<string, int>("a", 0 ));
a[0].Value = 0;
в последней строке ошибка
Ошибка CS0200 Невозможно присвоить значение свойству или индексатору "KeyValuePair<string, int>.Value" — доступ только для чтения.

Это как простой вариант, а вообще я делаю выгрузку в List<KeyValuePair<string, int>> и при попытке изменить Value для одного из элементов списка точно такая же ошибка.

Судя по MSDN
Свойства
СВОЙСТВА
Key
Возвращает ключ из пары "ключ-значение".
Value
Возвращает значение из пары "ключ-значение".

Видимо подразумевается только чтение данных, тогда каким образом из Dictionary можно забирать данные в списки или массивы чтобы потом их можно было бы менять?

Добавлено через 2 часа 1 минуту
Решение:
C#
1
ff[vv] = new KeyValuePair<string, int>(ff[vv].Key, ff[vv].Value + 1);
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.11.2020, 17:53
Ответы с готовыми решениями:

Память не может быть Read, Почему так ???
Привет всем! MyClass::MyClass(TWinControl* mOwner) { RefreshBtn = new TBitBtn(mOwner); ...

Почему в Read у FileStream offset это смещение в байтах?
Почему в Read у FileStream offset это смещение в байтах, а не в других единицах, например в...

Выдает ошибку i/o error 6 в delphi она останаливается на Read не пойму почему?
procedure TForm4.Button1Click(Sender: TObject); var Z:integer; begin...

Почему Read работает как Readln? (ide PascalABC.NET 3.10 build 1200)
Люди, у кого стоит такая-же IDE (PascalABC.NET 3.10 build 1200) - у вас такая же шняга или нет?...

18
Эксперт .NET
12547 / 8705 / 1311
Регистрация: 21.01.2016
Сообщений: 32,702
01.12.2020, 07:47 2
Цитата Сообщение от belalugoci Посмотреть сообщение
Почему read only?
Потому, что KeyValuePair - значимый тип.

Цитата Сообщение от belalugoci Посмотреть сообщение
Это как простой вариант, а вообще я делаю выгрузку в List<KeyValuePair<string, int>>
Вот реальный код и надо было показывать, потому, что код с массивами такой проблемы не даёт.

Если вы не знаете, что такое значимые типы, то не трогайте их, если это возможно. В вашем варианте не надо использовать KeyValuePair, заведите нормальный класс с двумя свойствами имеющими нормальные говорящие названия. С классами вы этой проблемы не получите.
0
667 / 264 / 28
Регистрация: 01.06.2018
Сообщений: 3,353
01.12.2020, 07:55  [ТС] 3
Цитата Сообщение от Usaga Посмотреть сообщение
Вот реальный код и надо было показывать, потому, что код с массивами такой проблемы не даёт.
с массивами проблема сохраняется. Просто в решении результат двух этапов, первый - переход от List к Array и второй - замена прямого присвоения на new, именно последнее работает.

Цитата Сообщение от Usaga Посмотреть сообщение
В вашем варианте не надо использовать KeyValuePair, заведите нормальный класс с двумя свойствами имеющими нормальные говорящие названия. С классами вы этой проблемы не получите.
C#
1
KeyValuePair<string, int>[] ff = Freq.OrderByDescending(x => x.Value).ToArray();
Как это будет выглядеть для моего кода?
0
Эксперт .NET
12547 / 8705 / 1311
Регистрация: 21.01.2016
Сообщений: 32,702
01.12.2020, 08:03 4
Цитата Сообщение от belalugoci Посмотреть сообщение
с массивами проблема сохраняется.
Это из-за того, что структура только для чтения:

Почему read only?

Ещё можно только целиком заместить другой.

Цитата Сообщение от belalugoci Посмотреть сообщение
Как это будет выглядеть для моего кода?
Какой тип имеет Freq и что вы в итоге хотите сделать?
0
667 / 264 / 28
Регистрация: 01.06.2018
Сообщений: 3,353
01.12.2020, 08:26  [ТС] 5
Цитата Сообщение от Usaga Посмотреть сообщение
Какой тип имеет Freq и что вы в итоге хотите сделать?
C#
1
Dictionary<string, int> Freq = new Dictionary<string, int>();
хочу получить пару <string, int> для чтения и записи, размеры такого списка/массива пока менять не планирую.
Создать свою структуру с полями <string, int> и загнать её в массив? А выгрузка в такой массив из словаря каким образом случится, по foreach?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
struct Pair
{
    string Key;
    int Value;
}
 
Pair[] p = new Pair[Freq.Count()];
int count = 0;
ForEach (var f in Freq)
{
    p[count].Key = f.Key;
    p[count++].Value = f.Value;
}
Так?
0
Эксперт .NET
12547 / 8705 / 1311
Регистрация: 21.01.2016
Сообщений: 32,702
01.12.2020, 08:40 6
Цитата Сообщение от belalugoci Посмотреть сообщение
хочу получить пару <string, int> для чтения и записи
Так у вас уже есть словарик со всеми парами.

Цитата Сообщение от belalugoci Посмотреть сообщение
Создать свою структуру с полями <string, int> и загнать её в массив?
Не структура, а класс. Но у вас уже есть словарик. Его и использовать желательно.
0
Неэпический
18109 / 10696 / 2062
Регистрация: 27.09.2012
Сообщений: 26,939
Записей в блоге: 1
01.12.2020, 08:49 7
Цитата Сообщение от belalugoci Посмотреть сообщение
Почему read only?
Для начала, почему C++?
0
667 / 264 / 28
Регистрация: 01.06.2018
Сообщений: 3,353
01.12.2020, 08:52  [ТС] 8
Цитата Сообщение от Usaga Посмотреть сообщение
Не структура, а класс
Не спорю, но как по мне в большинстве случаев для таких простых вещей класс не требуется.

Цитата Сообщение от Usaga Посмотреть сообщение
Но у вас уже есть словарик. Его и использовать желательно.
Как ранее писал Элд Хасп - словарик не слишком удобен в ряде ситуаций, например нет доступа по индексу (или это рождает неопределенность), нет возможности иметь два одинаковых ключа, нет возможности менять ключ и т.п.
Я посмотрю, можно ли как-то изменить код чтобы остаться в работе со словарём.

Добавлено через 43 секунды
Цитата Сообщение от Croessmah Посмотреть сообщение
Для начала, почему C++?
ошибся темой
0
Эксперт .NET
12547 / 8705 / 1311
Регистрация: 21.01.2016
Сообщений: 32,702
01.12.2020, 10:06 9
Цитата Сообщение от belalugoci Посмотреть сообщение
Не спорю, но как по мне в большинстве случаев для таких простых вещей класс не требуется.
Требуется, если нет необходимости озадачиться оптимизациями. Со структурами нужно аккуратно обращаться.

Цитата Сообщение от belalugoci Посмотреть сообщение
например нет доступа по индексу
Потому, что порядок неопределён. Но есть доступ по ключу.

Цитата Сообщение от belalugoci Посмотреть сообщение
нет возможности иметь два одинаковых ключа
Есть. Просто значением может выступать коллекция. Тогда одному ключу может соответствовать произвольное количество значений.

Цитата Сообщение от belalugoci Посмотреть сообщение
нет возможности менять ключ и т.п.
Есть: удаляете значение со старым ключом, вносите с новым.
0
Модератор
Эксперт .NET
15854 / 11000 / 2854
Регистрация: 21.04.2018
Сообщений: 32,311
Записей в блоге: 2
01.12.2020, 14:09 10
belalugoci, KeyValuePair создан специально под реализацию Нетовского словаря.
И не надо его использовать вне него.
Это не запрещено и возможно, но может создать кучу проблем.

В простейшем случае создайте массив кортежей:
C#
1
(string key, int count)[] a = new (string key, int count)[5];
Но кортеж - это тоже значимый тип.
Если вам надо менять одно из свойств по индексу, то надо создать свой ССЫЛОЧНЫЙ тип:
C#
1
2
3
4
5
6
7
public class KeyCounPair
{
    public string Key {get;}
    public int Count {get; set;}
    public KeyCounPair(string key)
       => Key = key;
}
И потом используйте его:
C#
1
2
3
KeyCounPair[] a = new KeyCounPair[5];
a.Append(newKeyCounPair("a"));
a[0].Count ++;
1
667 / 264 / 28
Регистрация: 01.06.2018
Сообщений: 3,353
01.12.2020, 17:09  [ТС] 11
Цитата Сообщение от Элд Хасп Посмотреть сообщение
И потом используйте его
не совсем понятно откуда появилась a[0], например я пишу
C#
1
2
3
4
5
KeyPair[] ff = new KeyPair[Freq.Count()];
foreach (var f in Freq)
{
    ff.Append();
}
и не понимаю как происходит адресация определенного элемента.

Добавлено через 17 минут
Цитата Сообщение от belalugoci Посмотреть сообщение
ff.Append();
C#
1
ff.Append(f.Key);
Ошибка CS0411 Аргументы типа для метода "Enumerable.Append<TSource>(IEnumerable<TSource>, TSource)" не могут определяться по использованию. Попытайтесь явно определить аргументы типа.
0
Модератор
Эксперт .NET
15854 / 11000 / 2854
Регистрация: 21.04.2018
Сообщений: 32,311
Записей в блоге: 2
01.12.2020, 17:53 12
Цитата Сообщение от belalugoci Посмотреть сообщение
не совсем понятно откуда появилась a[0], например я пишу
Ну, это ваш же код из первого поста.
Я откуда могу знать откуда вы его взяли?

Цитата Сообщение от belalugoci Посмотреть сообщение
foreach (var f in Freq)
Если Freq - это Dictionary<string, int>(), то так:
C#
1
2
KeyCounPair[] ff = Freq.Select(pair => new KeyCounPair(pair.Key){Count = pair.Value})
                               .ToArray();
Добавлено через 1 минуту
Цитата Сообщение от belalugoci Посмотреть сообщение
и не понимаю как происходит адресация определенного элемента.
Раз вам был нужен массив, то по индексу.
А какие ещё могут быть варианты?

Добавлено через 2 минуты
Цитата Сообщение от belalugoci Посмотреть сообщение
Ошибка CS0411
А что вы хотите собственно сделать методом Append?
Это метод расширения LINQ и он не изменяет исходной коллекции.
В параметрах он принимает тип элемента коллекции, а не ключ или значение.

Если же вы его переопределили, то я не видя реализации не могу сказать причины ошибки.
0
667 / 264 / 28
Регистрация: 01.06.2018
Сообщений: 3,353
02.12.2020, 11:45  [ТС] 13
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Если вам надо менять одно из свойств по индексу, то надо создать свой ССЫЛОЧНЫЙ тип
сериализовал этот тип
C#
1
2
3
4
5
BinaryFormatter fmt = new BinaryFormatter();
using (FileStream fs = new FileStream(String.Format(@"c:\work\words3\ff{0}.dat", tb), FileMode.OpenOrCreate))
{
    fmt.Serialize(fs, ff);
}
Десериализация:
C#
1
2
3
4
5
BinaryFormatter frm = new BinaryFormatter();
using (FileStream fs = new FileStream(@"c:\work\words3\ff8.dat", FileMode.OpenOrCreate))
{
    ff1 = (KeyPair[])formatter.Deserialize(fs);
}
По времени создания разница 30 минут, код программы не менялся.
Ошибка:
C#
1
KeyPair[] ff1 = (KeyPair[])frm.Deserialize(fs);
System.InvalidCastException
HResult=0x80004002
Сообщение = Невозможно выполнить приведение [A]KeyPair[] к [B]KeyPair[]. Источником типа A является "Words, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" в контексте "Default" в расположении "C:\work\Words3\bin\x64\Debug\Words.exe". Источником типа B является "Words, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" в контексте "Default" в расположении "C:\work\Words3\bin\x64\Debug\Words.exe".
Источник = Words
Трассировка стека:
at Words.Program.Main(String[] args) in C:\work\Words3\Program.cs:line 27
0
Модератор
Эксперт .NET
15854 / 11000 / 2854
Регистрация: 21.04.2018
Сообщений: 32,311
Записей в блоге: 2
02.12.2020, 12:44 14
Цитата Сообщение от belalugoci Посмотреть сообщение
сериализовал этот тип
Вы сериализовали не тип, а массив с элементами этого типа.
Такая сериализация может создать проблемы в виду введения в сохраняемые данные дополнительных атрибутов.
При бинарной сериализации это трудно понять.
Но если сделаете XML сериализацию, то будет видно наглядно.

Создайте свой тип и сериализуйте его.
C#
1
2
3
4
public class KeyPairArray 
{
    public KeyPair[] KeyPairs {get; set;}
}
C#
1
2
3
4
5
BinaryFormatter fmt = new BinaryFormatter();
using (FileStream fs = new File.Create(String.Format(@"c:\work\words3\ff{0}.dat", tb)))
{
    fmt.Serialize(fs, new KeyPairArray(){ KeyPairs = ff});
}
C#
1
2
3
4
5
BinaryFormatter frm = new BinaryFormatter();
using (FileStream fs = new FileOpen(@"c:\work\words3\ff8.dat"))
{
    ff1 = ((KeyPairArray)formatter.Deserialize(fs)).KeyPairs;
}
Добавлено через 38 секунд
И покажите реализацию вашего типа KeyPair.
0
667 / 264 / 28
Регистрация: 01.06.2018
Сообщений: 3,353
02.12.2020, 13:27  [ТС] 15
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Создайте свой тип и сериализуйте его.
запустил на проверку.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Но если сделаете XML сериализацию, то будет видно наглядно.
там XML будет весом 3-4 гига. И я плохо читаю XML/HTML. Но это мои проблемы.

Добавлено через 3 минуты
Цитата Сообщение от Элд Хасп Посмотреть сообщение
И покажите реализацию вашего типа KeyPair.
C#
1
2
3
4
5
6
7
8
        [Serializable]
        public class KeyPair
        {
            public string Key { get; }
            public int Value { get; set; }
            public KeyPair(string key)
               => Key = key;
        }
Добавлено через 23 минуты
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Создайте свой тип и сериализуйте его.
проблема сохраняется.
0
Модератор
Эксперт .NET
15854 / 11000 / 2854
Регистрация: 21.04.2018
Сообщений: 32,311
Записей в блоге: 2
02.12.2020, 13:40 16
Цитата Сообщение от belalugoci Посмотреть сообщение
там XML будет весом 3-4 гига. И я плохо читаю XML/HTML. Но это мои проблемы.
Не обязательно сериализовать большой массив.
Сделайте маленький с 3-5 элементами.
И посмотрите, что бы самому понять.

Добавлено через 27 секунд
Цитата Сообщение от belalugoci Посмотреть сообщение
проблема сохраняется.
Попробую у себя с вашей реализацией.
0
667 / 264 / 28
Регистрация: 01.06.2018
Сообщений: 3,353
02.12.2020, 13:42  [ТС] 17
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Не обязательно сериализовать большой массив.
Сделайте маленький с 3-5 элементами.
И посмотрите, что бы самому понять.
даже если я увижу что в одном случае А, а в другом Б - то я всё равно не знаю что мне с этой информацией делать.
0
Модератор
Эксперт .NET
15854 / 11000 / 2854
Регистрация: 21.04.2018
Сообщений: 32,311
Записей в блоге: 2
02.12.2020, 13:52 18
Цитата Сообщение от belalugoci Посмотреть сообщение
проблема сохраняется.
У меня работает без каких либо проблем.
Вот реализация:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    [Serializable]
    public class KeyPair
    {
        public string Key { get; }
        public int Value { get; set; }
        public KeyPair(string key)
           => Key = key;
    }
 
    [Serializable]
    public class KeyPairsArray
    {
        public KeyPair[] KeyPairs { get; set; }
    }
И код теста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    {
 
        KeyPair[] pairs =
        {
            new KeyPair("Один"){Value=123},
            new KeyPair("Два"){Value=456},
            new KeyPair("Три"){Value=789},
            new KeyPair("Четыре"){Value=102},
            new KeyPair("Пять"){Value=345}
        };
 
        BinaryFormatter formatter = new BinaryFormatter();
 
        using (var file = File.Create("KeyPairs.bin"))
            formatter.Serialize(file, new KeyPairsArray() { KeyPairs = pairs });
 
        using (var file = File.OpenRead("KeyPairs.bin"))
            pairs = ((KeyPairsArray) formatter.Deserialize(file)).KeyPairs;
 
    }
1
667 / 264 / 28
Регистрация: 01.06.2018
Сообщений: 3,353
03.12.2020, 05:06  [ТС] 19
Цитата Сообщение от Элд Хасп Посмотреть сообщение
У меня работает без каких либо проблем.
проверил ваш пример, у меня тоже работает, сравнил с тем, как реализовано у меня - разница только в использовании FileStreamer, переделал на File.Create/OpenRead - и всё сразу заработало. Проверять подробнее не стану, буду пользоваться так.
0
03.12.2020, 05:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.12.2020, 05:06
Помогаю со студенческими работами здесь

Почему Reader.Read() начинает чтение не с первой строки данного столбца? Класс Oledb
Проблема в том что я вызываю Reader.read() при открытии формы , и мне reader возвращает не первую а...

Bluetooth Android. read failed, socket might closed or timeout, read ret: -1
Всем привет! Есть след. девайсы: OnePlus, Samsung A50, Pixel 3a Пытаюсь подключить девайсы по...

А почему ошибка, что функции print и read не определены в функции main()?
Что-то не понимаю. Они определены в заголовочном файле. А подчеркивается красным что нет.... ...

Почему такая ошибка "TypeError: Cannot read property 'bind' of undefined"?
import React from 'react'; import ReactDOM from 'react-dom'; class Todo extends...

Почему выбивает ошибку "Uncaught TypeError: Cannot read property '0' of undefined"?
Почему выбивает ошибку? Пытаюсь сделать условие, а оно пишет: Uncaught TypeError: Cannot read...

В чем отличие read от read-line
Подскажите чем отличается read от read-line.


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

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