Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вопрос по random'у 
:(
    Опции темы
derek
Дата 29.10.2006, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 16.7.2006

Репутация: нет
Всего: нет



вообщем задача такая, есь массив L1,L2,L3. Массивы L1 и L2 заполняются случайными числами. Есть процедура, которая поочередно сравнивает каждое значение обоих массивов, и если значения равны, то это значение записывается в L3...

проблема в следующем, если забить массивы L1,L2 в ручную то все работает, а если массивы L1, L2 забиваются рандомно, то ничего не работает...


вот код забивания массивов рандомом

Код

 Random rnd = new Random();

            for (int i = 0; i < 10; i++)
            {
                L1.Items.Add(rnd.Next(10));
            }

            for (int i = 0; i < 10; i++)
            {
                L2.Items.Add(rnd.Next(10));

            }



а вот код сравнение элементов массивов L1 и L2


Код

for (int i = 0; i < 10; i++)
            {
                for (int j = 0; j < 10; j++)
                {
                    if (L1.Items[i] == L2.Items[j])
                    {
                        L3.Items.Add(L1.Items[i]);    
                    }
                
                }
                
            }



P.s. под "массивами" в данном случае имею ввиду listbox

PM MAIL   Вверх
mr.DUDA
Дата 29.10.2006, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Так ведь если массивы заполняются случайными числами от 0 до N, не факт что обязательно найдётся попарное совпадение. Например, в одном массиве не будет числа 4, а в другом - числа 8.

И что вообще означает:
Цитата(derek @  29.10.2006,  20:44 Найти цитируемый пост)
 а если массивы L1, L2 забиваются рандомно, то ничего не работает...


 smile 

Что именно "не работает" ? Поконкретнее.


--------------------
user posted image
PM MAIL WWW   Вверх
derek
Дата 29.10.2006, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 16.7.2006

Репутация: нет
Всего: нет



mr.DUDA, массивы у меня заполняются не от 0 до N, а от 0 до 10-ти...и самих элементов каждого массива 10. так что там не может не быть хотя бы одного совпадения...
а не работает буквально - нажимаю на кнопку на которую повешен код сравнения L1 и L2 - и как будто я на нее и не нажимал...вообщем эффекта ноль...в то же время - если руками забить ТЕ ЖЕ числа которые при предыдущем запуске сгенерировал рандом - то все работает...

такое ощущение что  в коде заполнения массивов рандомными значениями,в listbox'ы просто добаляются строчки со случайными числами, а item'ам соостветвующие значение не присваиваются...т.е...массив значениями не заполняются - не знаю как это может быть....



Это сообщение отредактировал(а) derek - 29.10.2006, 22:54
PM MAIL   Вверх
Exception
Дата 29.10.2006, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 29
Всего: 186



Тьфу ты. С каких пор ListBox называют массивом?! Этим ты всех и запутал.
В ListBox'е хранятся ссылки на объекты. Поэтому, когда ты добавляешь в него число, оно "оборачивается" (boxing) в System.Object и в этом виде добавляется в коллекцию Items. Таким образом, сравнивая два элемента, фактически, ты сравниваешь ссылки на объекты, а не их значения. Используй if ((int)L1[i] == (int)L2[j]), и будет тебе счастье smile .
PM   Вверх
mr.DUDA
Дата 29.10.2006, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(derek @  29.10.2006,  21:54 Найти цитируемый пост)
mr.DUDA, массивы у меня заполняются не от 0 до N, а от 0 до 10-ти..

0..N общий случай для 0..10, мы говорим об одном и том же

Цитата(derek @  29.10.2006,  21:54 Найти цитируемый пост)
и самих элементов каждого массива 10. так что там не может не быть хотя бы одного совпадения...

хотя бы одно будет

Цитата(derek @  29.10.2006,  21:54 Найти цитируемый пост)
а не работает буквально - нажимаю на кнопку на которую повешен код сравнения L1 и L2 - и как будто я на нее и не нажимал...вообщем эффекта ноль...в то же время - если руками забить ТЕ ЖЕ числа которые при предыдущем запуске сгенерировал рандом - то все работает...

оч. странно... чем отличается код, когда int-ы руками забиваются в листбокс, от кода с random-ом ? можно его посмотреть ?

Цитата(Exception @  29.10.2006,  22:27 Найти цитируемый пост)
В ListBox'е хранятся ссылки на объекты. Поэтому, когда ты добавляешь в него число, оно "оборачивается" (boxing) в System.Object и в этом виде добавляется в коллекцию Items. Таким образом, сравнивая два элемента, фактически, ты сравниваешь ссылки на объекты, а не их значения. Используй if ((int)L1[i] == (int)L2[j]), и будет тебе счастье

но другой пример то работает !  smile 


--------------------
user posted image
PM MAIL WWW   Вверх
derek
Дата 30.10.2006, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 16.7.2006

Репутация: нет
Всего: нет



Цитата(mr.DUDA @  29.10.2006,  23:49 Найти цитируемый пост)
оч. странно... чем отличается код, когда int-ы руками забиваются в листбокс, от кода с random-ом ? можно его посмотреть ?


тут я немного неправильно выразился. под "вводом значений руками" я подразумевал "ввод значений через конструктор"...т.е. кода собственно и не было



Цитата(Exception @  29.10.2006,  23:27 Найти цитируемый пост)
Тьфу ты. С каких пор ListBox называют массивом?! Этим ты всех и запутал.
В ListBox'е хранятся ссылки на объекты. Поэтому, когда ты добавляешь в него число, оно "оборачивается" (boxing) в System.Object и в этом виде добавляется в коллекцию Items. Таким образом, сравнивая два элемента, фактически, ты сравниваешь ссылки на объекты, а не их значения. Используй if ((int)L1[i] == (int)L2[j]), и будет тебе счастье  . 


да это работает...но есть вопрос - что это вообще за метод такой (int)L1[i] - имею ввиду (int) - это ведь не конвертирование, ведь нельзя объект переконвентировать в int...вообщем это работает...но КАК это работает мне не ясно...
PM MAIL   Вверх
Exception
Дата 30.10.2006, 01:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 29
Всего: 186



Почему? При выполнении Add мы упаковываем value-тип int (System.Int32) в object (System.Object), а потом приводим object к типу int и распаковываем. По сути, операция приведения - это и есть конвертация.

mr.DUDA, волшебство, однако. Действительно, почему работает ручное заполнение?
PM   Вверх
thomas
Дата 30.10.2006, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 6
Всего: 65



Exception, 
Цитата

Действительно, почему работает ручное заполнение? 


Потому как товарищ derek, сам ответил на свой вопрос 
Цитата

массив значениями не заполняются 


ListBox он заполняет, а где он присваивает значения своим массивам я не увидел.

Он заполняет значениями только listBox L1 L2. А где массивы?


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
mr.DUDA
Дата 30.10.2006, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Когда руками добавляем, в дизайнере - в листбоксе будут строки. А в примере сравниваются числа. Пример вообще не должен работать при таких условиях.


--------------------
user posted image
PM MAIL WWW   Вверх
thomas
Дата 30.10.2006, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 6
Всего: 65



Привет всем.

Мне думается, должно быть так
Код

Random rnd = new Random();
            int getal1, getal2;
            int[] table1 = new int[9];
            int[] table2 = new int[9];
            int[] table3 = new int[9];
            for (int i = 0; i < 10; i++)
            {
                getal1 = rnd.Next(10);
                L1.Items.Add(getal1.ToString());
                table1[i] = getal1;
            }

            for (int i = 0; i < 10; i++)
            {
                getal2 = rnd.Next(10);
                L2.Items.Add(getal2.ToString());
                table2[i] = getal2;
            }

            for (int i = 0; i < 10; i++)
            {
                for (int j = 0; j < 10; j++)
                {
                    if (table1[i] == table2[j])
                    {
                        L3.Items.Add(table1[i].ToString());
                        table3[i]=table1[i];
                    }

                }

            }



PS извините переменную по фламандски назвал getal=число.  smile 


Это сообщение отредактировал(а) thomas - 30.10.2006, 18:14


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
Exception
Дата 31.10.2006, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 29
Всего: 186



mr.DUDA
В том-то и дело!
Как тебе известно, строки - ссылочные объекты, а потому сравнение одинаковых строк будет работать и без приведения типов: ссылки на одинаковые строки будут одинаковыми. А вот для value-типов следует выполнять приведение, так как ссылки всегда будут разными.
Именно поэтому заполнение строк в дизайнере срабатывало.
PM   Вверх
archimed7592
Дата 31.10.2006, 02:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 7
Всего: 93



Цитата(Exception @  31.10.2006,  01:49 Найти цитируемый пост)
Именно поэтому заполнение строк в дизайнере срабатывало.

добавление в дизайнере от программного добавления отличается немногим...если заглянуть в *.designer.cs, то можно увидеть list1.Items.Add ("...")...и что выдаст такой код?
Код
            listBox1.Items.Add("abc");
            listBox2.Items.Add("abc");
            if (listBox1.Items[0] == listBox2.Items[0])
                throw new Exception();
Код
            String s1 = "abc";
            String s2 = "abc";
            listBox1.Items.Add(s1);
            listBox2.Items.Add(s2);
            if (listBox1.Items[0] == listBox2.Items[0])
                throw new Exception();
Код
            String s1 = "abc";
            String s2 = "abcd".Remove(3);
            listBox1.Items.Add(s1);
            listBox2.Items.Add(s2);
            if (listBox1.Items[0] == listBox2.Items[0])
                throw new Exception();
1-исключение, 2-исключение, 3-ок...вывод? виноват string pooling. smile

Это сообщение отредактировал(а) archimed7592 - 31.10.2006, 02:10


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
mr.DUDA
Дата 31.10.2006, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(archimed7592 @  31.10.2006,  01:09 Найти цитируемый пост)
1-исключение, 2-исключение, 3-ок...вывод? виноват string pooling. 

У меня такой же код выдаёт Ok:

Код
using System;
using System.Windows.Forms;

class Program
{
    static void Main()
    {
        ListBox listBox1 = new ListBox();
        ListBox listBox2 = new ListBox();

        listBox1.Items.Add("abc");
        listBox2.Items.Add("abc");

        if (listBox1.Items[0] == listBox2.Items[0])
            Console.Write("ok");
    }
}


хммм ?..  smile 


--------------------
user posted image
PM MAIL WWW   Вверх
archimed7592
Дата 31.10.2006, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 7
Всего: 93



Цитата(mr.DUDA @  31.10.2006,  11:12 Найти цитируемый пост)
У меня такой же код выдаёт Ok:
он у тебя не такой же smile у тебя вместо throw new Exception () стоит Console.WriteLine ("ok") потому и выдаёт OK smile


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
mr.DUDA
Дата 31.10.2006, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(archimed7592 @  31.10.2006,  16:18 Найти цитируемый пост)
он у тебя не такой же  у тебя вместо throw new Exception () стоит Console.WriteLine ("ok") потому и выдаёт OK

Ну это несерьёзно  smile, почему string pooling работает-то ?... К примеру, если абстрагироваться от листбокса (оффтоп пошёл) и запихнуть одинаковые стринговые литералы в два разных object-а, то сравнивать будет корректно. А почему у derek работает сравнение строки с int-ом, я так и не въехал, видимо неправильная у меня трава  smile 


--------------------
user posted image
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.4266 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.