4 / 4 / 0
Регистрация: 28.05.2011
Сообщений: 84
1

Как присвоить переменной объект из цикла foreach

23.06.2012, 00:25. Показов 5900. Ответов 15
Метки нет (Все метки)

на сам код особенно внимание не обращайте. суть трабла - не могу присвоить переменной объект из цикла foreach

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
 private void testReflection()
    {
 
        WidgetLoader AssemblyLoader = new WidgetLoader();
        availableAssembles = AssemblyLoader.GetaAvailableWidgetsList(); // 
        DockPanel DPanel;
 
         foreach (Control x in WorkingPanelsContainer.Items)
        {
 
            if (x is TabItem)
            {
 
                TabItem t = (TabItem) x;
 
                if (t.Header.Equals("test panel!"))
                {
 
                   DockPanel p = ((WPControl)t.Content).GetContainers()[0]; // тут все ок
                                                        
                   SolidColorBrush br =  Brushes.Black;
 
                   p.Background = br;
                   DPanel = p; // вот этот код вызывает ошибку
       
                  }
            }
        }

получаю сообщение, что "Use of unassigned local variable 'DPanel' " блин.. не пойму в чем дело
в отладчике видно, что DockPanel p не пустая.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.06.2012, 00:25
Ответы с готовыми решениями:

Изменение переменной цикла foreach
Здравствуйте. Возник вопрос: к примеру у меня есть массив (большой размерности). Мне надо каждый...

Присвоить объект переменной
Погуглив решил всё таки спросить. Как сделать в D7 что типа такого как в Python. a=...

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

Как выйти из цикла foreach
Как досрочно выйти из цикла foreach?

15
310 / 248 / 44
Регистрация: 06.12.2010
Сообщений: 527
23.06.2012, 00:28 2
Потому что у Вас объявлена переменная, но ей не присвоено значение.
У Вас так:
C#
1
DockPanel DPanel;
А надо так:
C#
1
DockPanel DPanel = new DockPanel();//Или любое другое значение, можно даже null
0
265 / 255 / 43
Регистрация: 18.03.2012
Сообщений: 506
23.06.2012, 00:37 3
Use of unassigned local variable - ошибка компилятора. Если вы не можете скомпилировать проект, при чем тут отладчик?
0
555 / 509 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
23.06.2012, 00:55 4
ты не весь код показал. твоя переменная DPanel получает значение только если хотя бы один раз x is TabItem, иначе ей не присваивается никакое значение. а ты где-то в коде, который остался за кадром, пытаешься эту переменную использовать (уж не знаю как, посмотри сам).
0
4 / 4 / 0
Регистрация: 28.05.2011
Сообщений: 84
23.06.2012, 18:29  [ТС] 5
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
    private void testReflection()
    {
 
        WidgetLoader AssemblyLoader = new WidgetLoader();
        availableAssembles = AssemblyLoader.GetaAvailableWidgetsList(); // 
        DockPanel DPanel;// = null;
 
         foreach (Control x in WorkingPanelsContainer.Items)
        {
 
            if (x is TabItem)
            {
 
                TabItem t = (TabItem) x;
 
                if (t.Header.Equals("test panel!"))
                {
 
                   DockPanel p = ((WPControl)t.Content).GetContainers()[0];
                                                        
                   SolidColorBrush br =  Brushes.Black;
 
                   p.Background = br;
                   DPanel = p;
                   
        
                }
           
            }
 
        }
 
 
         var type = from i in availableAssembles[0].GetTypes() where i.IsClass && (i.GetInterface("IWLoader") != null) select i;
 
         foreach (Type t in type)
         {
 
 
             IWLoader temp = (IWLoader)availableAssembles[0].CreateInstance(t.FullName, true);
 
             bool r = (DPanel != null);
           
 
         }
 
    
    }

сорри я не весь код привел. если закомментировать последнюю строку , то ошибки нет. если раскомментировать , то Error-Use of unassigned local variable 'DPanel'
при том, что в строке DPanel = p; мы передаем ссылке реальный объект. ОН действительно присваивается в процессе выполнения программы. а вот на этапе компиляции ошибка

Добавлено через 1 минуту
Цитата Сообщение от umnick_kh Посмотреть сообщение
Потому что у Вас объявлена переменная, но ей не присвоено значение.
У Вас так:
C#
1
DockPanel DPanel;
А надо так:
C#
1
DockPanel DPanel = new DockPanel();//Или любое другое значение, можно даже null
мы, вроде, объявляем ссылку на объект и главное до начала ее использования проинициализирвать ее тем самым объектом.

Добавлено через 1 минуту
Цитата Сообщение от novi4ok Посмотреть сообщение
ты не весь код показал. твоя переменная DPanel получает значение только если хотя бы один раз x is TabItem, иначе ей не присваивается никакое значение. а ты где-то в коде, который остался за кадром, пытаешься эту переменную использовать (уж не знаю как, посмотри сам).
это я проверил. значение реально имеется. там где DPanel = p; , p не null
0
265 / 255 / 43
Регистрация: 18.03.2012
Сообщений: 506
23.06.2012, 21:38 6
Компилятор не считает переменную инициализированной если она инициализируется (простите за тавтологию) только в некоторых случаях (что вполне логично). То есть, если !x is TabItem или !t.Header.Equals("test panel!"), переменной не будет присвоено значение и вы не сможете ею пользоваться.
Ссылка, при объявлении, не считается инициализированной. Не надо убирать
C#
1
DockPanel DPanel = null;
Это один из вариантов решения вашей проблемы.
1
555 / 509 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
23.06.2012, 23:17 7
Цитата Сообщение от coderisimo Посмотреть сообщение
это я проверил. значение реально имеется. там где DPanel = p; , p не null
это - если if (x is TabItem) хотя бы один раз. а если нет, то DPanel никогда не присвоится значение (хотя бы null). один из вариантов решения тебе уже подсказали.
0
4 / 4 / 0
Регистрация: 28.05.2011
Сообщений: 84
24.06.2012, 01:16  [ТС] 8
Цитата Сообщение от Lasur Посмотреть сообщение
Компилятор не считает переменную инициализированной если она инициализируется (простите за тавтологию) только в некоторых случаях (что вполне логично). То есть, если !x is TabItem или !t.Header.Equals("test panel!"), переменной не будет присвоено значение и вы не сможете ею пользоваться.
Ссылка, при объявлении, не считается инициализированной. Не надо убирать
C#
1
DockPanel DPanel = null;
Это один из вариантов решения вашей проблемы.
да да.. это я уже понял. долго не мог понять , что не нравится компилятору.
спасибо за ответ!

Добавлено через 1 минуту
Цитата Сообщение от novi4ok Посмотреть сообщение
это - если if (x is TabItem) хотя бы один раз. а если нет, то DPanel никогда не присвоится значение (хотя бы null). один из вариантов решения тебе уже подсказали.

у меня там без вариантов, в коллекции обязательно есть TabItem ... но компилятор об этом не знает )))
0
555 / 509 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
24.06.2012, 01:20 9
Цитата Сообщение от coderisimo Посмотреть сообщение
у меня там без вариантов, в коллекции обязательно есть TabItem ... но компилятор об этом не знает )))
ну вот, ты и просиял.
0
Master of Orion
Эксперт .NET
6087 / 4943 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
24.06.2012, 12:36 10
Кстати, еще вопрос про foreach: не знаю, может я тупой или что, но допустим мне надо найти в коллекции определенное значение, я могу сделать 2-3 вложенных for по старинке, могу запустить foreach, и я вынужден пользоваться первым случаем, потому что тогда я не могу получить индексы того элемента, который мне нужен (то есть мне не просто значение нужно, по значению я как раз хочу найти индекс элемента, у которого это значение). Может там есть какая-то встроенная функция? А то получается довольно ограниченное применение: только для копирования и чтения, и то не всех параметров. Например, если я хочу скопировать значения массив (не стандартной процедурой), то мне нужно все равно писать циклы по i,j и копировать, потому что массиву они нужны, а не только само значение..
0
4 / 4 / 0
Регистрация: 28.05.2011
Сообщений: 84
24.06.2012, 12:49  [ТС] 11
Цитата Сообщение от Psilon Посмотреть сообщение
Кстати, еще вопрос про foreach: не знаю, может я тупой или что, но допустим мне надо найти в коллекции определенное значение, я могу сделать 2-3 вложенных for по старинке, могу запустить foreach, и я вынужден пользоваться первым случаем, потому что тогда я не могу получить индексы того элемента, который мне нужен (то есть мне не просто значение нужно, по значению я как раз хочу найти индекс элемента, у которого это значение). Может там есть какая-то встроенная функция? А то получается довольно ограниченное применение: только для копирования и чтения, и то не всех параметров. Например, если я хочу скопировать значения массив (не стандартной процедурой), то мне нужно все равно писать циклы по i,j и копировать, потому что массиву они нужны, а не только само значение..
если я правильно понял вопрос, то во-первых можно ввести переменную которая и будет индексом (но это конечно, велосипед )
в общем виде :
C#
1
2
3
4
5
6
int index =0;
foreach (x in list)
{
if (x == "то шо надо") {break;}
index++;
}
в результате index это индекс искомого элемента.
но ваащет есть еще и метод indexof, да и сам индекс часто не нужен, а нужен объект из коллекции , а его можно и без получения индекса использовать.

C#
1
2
3
4
5
foreach (x in list)
{
if (x == "то шо надо") {делаем что-то с найденным объектом x;}
 
}
если это не то, то приведи пример задачи и реализацию без foreach , тогда будет понятнее твой вопрос.
0
265 / 255 / 43
Регистрация: 18.03.2012
Сообщений: 506
24.06.2012, 13:04 12
Цитата Сообщение от Psilon Посмотреть сообщение
допустим мне надо найти в коллекции определенное значение, я могу сделать 2-3 вложенных for по старинке
Вы говорите об использовании индексаторов?
C#
1
2
3
var list = new List<int> { 1, 2, 3 };
for (int i = 0; i < list.Count; i++)
    Console.WriteLine(list[i]);
О каких вложенных циклах речь?
Цитата Сообщение от Psilon Посмотреть сообщение
я вынужден пользоваться первым случаем, потому что тогда я не могу получить индексы того элемента, который мне нужен (то есть мне не просто значение нужно, по значению я как раз хочу найти индекс элемента, у которого это значение)
Когда "тогда"? Первый случай перебора коллекции (как я понял сие запутанное предложение), у вас через цикл for, что никак не мешает получению индекса. С foreach можете делать так:
C#
1
2
3
4
5
6
int index = -1;
foreach(var elem in list)
{
    index++;
    if (elem == value) break;
}
Цитата Сообщение от Psilon Посмотреть сообщение
Может там есть какая-то встроенная функция?
Для чего? Для нахождения индекса элемента в коллекции? Метод расширения
T First<T>(this IEnumerable<T>, Func<T, bool>), например.
Цитата Сообщение от Psilon Посмотреть сообщение
Например, если я хочу скопировать значения массив (не стандартной процедурой), то мне нужно все равно писать циклы по i,j и копировать, потому что массиву они нужны, а не только само значение..
Здесь, простите, я уже ничего не понял...

Не по теме:

Пожалуйста, склоняйте слова и делайте предложения меньшего объема:wall:

0
Master of Orion
Эксперт .NET
6087 / 4943 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
24.06.2012, 14:38 13
Lasur, Хорошо. Предположим у меня есть трехмерный массив. Мне нужно каждый его элемент преобразовать по определенному алгоритму и впихнуть в массив той же размерности, но с другими значениями. То есть что-то вроде
C#
1
2
3
4
5
6
7
int[,,] A = new int[n,m,p];
int[,,] B = new int[n,m,p];
...
for (int i = 0; i<n,i++)
  for (int j = 0; i<m,i++)
    for (int k = 0; i<p,i++)
       B[i,j,k] = A[i,j,k]*a + b;
Я додумался в foreach запихивать, вводя доп. переменные, как у вас под названием index. Но тогда теряется весь смысл в foreach и проще тупо по старинке через вложенные for делать.
0
265 / 255 / 43
Регистрация: 18.03.2012
Сообщений: 506
24.06.2012, 15:30 14
Psilon, могу предложить вам "извращение" через LINQ. Метод Create3dArray можно использовать во всех подобных случаях.
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
    static class Program
    {
        static int MyFunc(int x)
        {
            //You function here...
            return x + 1;
        }
 
        static T[, ,] Create3dArray<T>(this IEnumerable<T> seq, int d1, int d2, int d3)
        {
            var res = new T[d1, d2, d3];
            var index = -1;
            try
            {
                foreach (var elem in seq)
                {
                    index++;
                    var temp = index / (d2 * d3);
                    res[temp, (index - temp * d2 * d3) / d3, index % d3] = elem;
                }
            }
            catch (IndexOutOfRangeException)
            {
                throw new ArgumentException("Sequence too long", "seq");
            }
            return res;
        }
 
        static void Main()
        {
            int n = 10, m = 5, p = 2;
            var A = new int[n, m, p];
            var B = A.Cast<int>().Select(MyFunc).Create3dArray(n, m, p);
        }
    }
0
Master of Orion
Эксперт .NET
6087 / 4943 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
24.06.2012, 15:56 15
Lasur, с LINQ вообще не работал. Так что можно считать, что без for тут не обойтись (все-таки 3 вложенных for легче написать, чем такой код). Но таки с LINQ надо поразбираться. Что посоветуете почитать, чтобы иметь представление? А то большинство книг заканчивается на обработке исключений и делегатах.
0
265 / 255 / 43
Регистрация: 18.03.2012
Сообщений: 506
24.06.2012, 17:05 16
Цитата Сообщение от Psilon Посмотреть сообщение
все-таки 3 вложенных for легче написать, чем такой код
Вся суть в том, что
Цитата Сообщение от Lasur Посмотреть сообщение
Метод Create3dArray можно использовать во всех подобных случаях
То есть, после объявления метода можно просто писать одну строку
C#
1
var B = A.Cast<int>().Select(MyFunc).Create3dArray(n, m, p);
Цитата Сообщение от Psilon Посмотреть сообщение
Что посоветуете почитать, чтобы иметь представление?
База есть в Шилдте (глава XIX).
Дальнейшее изучение можно продолжить самостоятельно решая различные задачи (придумывать самому, искать на форуме и т.д.), просматривая и разбирая примеры из интернета:
1) 7 tricks to simplify your programs with LINQ
2) 101 LINQ Samples
3) Описание LINQ
, читая MSDN.

На сайте [книги]C# in Depth есть детальное описание интерфейса итераторов. Кстати, многие утверждают, что в этой самой С# in Depth отличное описание LINQ, да и сама книга чудесная. Я лично, ее пока не прочитал)

Где то натыкался на очень интересное решение некой мат задачи в "одну строку", но к сожалению, задачу забыл, а ссылку посеял). С другой стороны, интересных "LINQ идей" в интернете полно.

Добавлено через 19 минут
Цитата Сообщение от Lasur Посмотреть сообщение
Вся суть в том, что метод Create3dArray можно использовать во всех подобных случаях. То есть, после объявления метода можно просто писать одну строку
Ерунду здесь написал, туго сейчас соображаю
Можно просто в одну строку реализовать и все три for, написав соответствующий метод, да и работать он будет в разы быстрее. Так что мой код выше абсолютно бесполезен в вашей задаче.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.06.2012, 17:05

Как присвоить значение переменной, исходя из значения другой переменной?
Всем привет. Нужна помощь. Есть переменная, например &quot;month&quot; которая может принимать значения...

Как присвоить имя переменной равное аргументу другой переменной?
В общем вопрос такой: Допустим есть переменная string i= &quot;qwer&quot;, хочу создать другую переменную ...

Как переменной описанной в программе присвоить значение переменной в Conditional Compilation Arguments?
Kak mozhno peremennij opisanoj v programme prisvoit` znachenie peremennoj v Conditional Compilation...

Как присвоить переменной файл если, допустим, путь к файлу находится в переменной s?
Ну, допустим, у меня в переменной s хранится путь к файлу. Как переменной, допустим, f присвоить...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.