168 / 131 / 29
Регистрация: 16.02.2013
Сообщений: 867
1

Передача List другому классу

08.08.2013, 01:22. Показов 1057. Ответов 2
Метки нет (Все метки)

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
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;
 
namespace test_vk
{
    /// <summary>
    /// Description of MainForm.
    /// </summary>
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }
        List<Thread> thread_list=new List<Thread>();
        List<test> test_list=new List<test>();
        List<string> str_list=new List<string>();
 
        
        void Button1Click(object sender, EventArgs e)
        {
            str_list.Add("a");
            str_list.Add("b");
            str_list.Add("c");
            str_list.Add("d");
            str_list.Add("e");
            
            for (int i = 0; i < 50; i++) {
                test_list.Add(new test(this));
                test_list[i].List_Create=str_list;
                thread_list.Add(new Thread(thread_metod));
                thread_list[i].Start(test_list[i]);
                
                
            }
        }
        
        void thread_metod(object o){
            test t=(test)o;
            t.st();
        
        }
 
    }
    
    public class test{
        public test(MainForm mainf){m=mainf;}
        
        
        static MainForm m;
        List<string> listo;
        public List<string> List_Create{set {listo=value;}}
        delegate void Add_Textbox(string str);
        Add_Textbox Add=delegate(string s){m.textBox1.Text+=s+Environment.NewLine;};
        public void st(){
            if(listo.Count>0){
                m.textBox1.Invoke(Add,listo[0]);
                listo.RemoveAt(0);
            
            }
            
        }
        
    
    
    
    }
}
При нажатии на кнопку создаются обьекты класса test, далее полю List_Create присваиваится List, содержащий 5 строк, создается поток, и уже в потоке выполняется метод st(). Он удаляет 1 ячейку из коллекции listo. Программа падает с исключением -
C#
1
System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
в строке
C#
1
m.textBox1.Invoke(Add,listo[0]);
Как такое возможно? Ведь мы передали каждому обьекту свою коллекцию из 5 элементов

Добавлено через 18 минут
к тому же имеется проверка -
C#
1
if(listo.Count>0){.....
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.08.2013, 01:22
Ответы с готовыми решениями:

Передача значимого типа от одного List<T> другому
Добрый день, уважаемые форумчане! Прошу помочь в передаче значений от одного List&lt;T&gt; другому: дело...

Как добавить элементы одного List к другому List
public class groupIndicators { public string Name { get; set; } //Наименование группы...

Добавление содержимого List к другому List
Здравствуйте уважаемые. Имеется коллекция: List&lt;Product&gt; tempListProducts = new List&lt;Product&gt;();...

Обратиться к другому классу и методу несколько раз
Всем привет. Подскажите пожалуйста, как правильно поступить с такой задачей. В результате...

2
168 / 131 / 29
Регистрация: 16.02.2013
Сообщений: 867
08.08.2013, 01:33  [ТС] 2
изменил немного -
C#
1
2
3
4
5
6
7
8
9
10
11
        public void st(){
            m.textBox1.Invoke(Add,listo.Count.ToString());
            if(listo.Count>0){
                try{
            //  m.textBox1.Invoke(Add,listo[0]);
                listo.RemoveAt(0);
                }
                catch{}
            }
            
        }
Каким то чудом поток содержит в коллекцию из 4 элементов . Я так полагаю, что передается ссылка на коллекцию, при передаче в другой обьект?
Миниатюры
Передача List другому классу  
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
08.08.2013, 15:08 3
Цитата Сообщение от Winhttp22 Посмотреть сообщение
передается ссылка на коллекцию, при передаче в другой обьект
именно так, для создания копии пишем Clone() и используем его.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.08.2013, 15:08
Помогаю со студенческими работами здесь

Как получить доступ к другому классу из .Net Remoting
Здравствуйте! Пример ситуации: есть класс А, который я используя для .Net Remoting и форма (класс...

Не получается передать значение одного класса в другому классу
Добрый день не получается передать значение indi класса А в класс Anssingment Заранне благодарен!...

Как сделать event, чтобы об изменение коллекции сообщалось другому классу?
Доброго времени суток! Борьба с ООП не на жизнь, а на смерть: Есть ObservableCollection, добавляю...

Сортировка List по классу обьекта
есть родительский класс class ClientBasic { private double energy; private...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru