Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/40: Рейтинг темы: голосов - 40, средняя оценка - 4.80
4 / 4 / 0
Регистрация: 28.05.2011
Сообщений: 84

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

23.06.2012, 00:25. Показов 8550. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.06.2012, 00:25
Ответы с готовыми решениями:

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

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

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

15
 Аватар для umnick_kh
311 / 249 / 44
Регистрация: 06.12.2010
Сообщений: 527
23.06.2012, 00:28
Потому что у Вас объявлена переменная, но ей не присвоено значение.
У Вас так:
C#
1
DockPanel DPanel;
А надо так:
C#
1
DockPanel DPanel = new DockPanel();//Или любое другое значение, можно даже null
0
 Аватар для Lasur
267 / 257 / 43
Регистрация: 18.03.2012
Сообщений: 506
23.06.2012, 00:37
Use of unassigned local variable - ошибка компилятора. Если вы не можете скомпилировать проект, при чем тут отладчик?
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
23.06.2012, 00:55
ты не весь код показал. твоя переменная DPanel получает значение только если хотя бы один раз x is TabItem, иначе ей не присваивается никакое значение. а ты где-то в коде, который остался за кадром, пытаешься эту переменную использовать (уж не знаю как, посмотри сам).
0
4 / 4 / 0
Регистрация: 28.05.2011
Сообщений: 84
23.06.2012, 18:29  [ТС]
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
 Аватар для Lasur
267 / 257 / 43
Регистрация: 18.03.2012
Сообщений: 506
23.06.2012, 21:38
Компилятор не считает переменную инициализированной если она инициализируется (простите за тавтологию) только в некоторых случаях (что вполне логично). То есть, если !x is TabItem или !t.Header.Equals("test panel!"), переменной не будет присвоено значение и вы не сможете ею пользоваться.
Ссылка, при объявлении, не считается инициализированной. Не надо убирать
C#
1
DockPanel DPanel = null;
Это один из вариантов решения вашей проблемы.
1
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
23.06.2012, 23:17
Цитата Сообщение от coderisimo Посмотреть сообщение
это я проверил. значение реально имеется. там где DPanel = p; , p не null
это - если if (x is TabItem) хотя бы один раз. а если нет, то DPanel никогда не присвоится значение (хотя бы null). один из вариантов решения тебе уже подсказали.
0
4 / 4 / 0
Регистрация: 28.05.2011
Сообщений: 84
24.06.2012, 01:16  [ТС]
Цитата Сообщение от Lasur Посмотреть сообщение
Компилятор не считает переменную инициализированной если она инициализируется (простите за тавтологию) только в некоторых случаях (что вполне логично). То есть, если !x is TabItem или !t.Header.Equals("test panel!"), переменной не будет присвоено значение и вы не сможете ею пользоваться.
Ссылка, при объявлении, не считается инициализированной. Не надо убирать
C#
1
DockPanel DPanel = null;
Это один из вариантов решения вашей проблемы.
да да.. это я уже понял. долго не мог понять , что не нравится компилятору.
спасибо за ответ!

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

у меня там без вариантов, в коллекции обязательно есть TabItem ... но компилятор об этом не знает )))
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
24.06.2012, 01:20
Цитата Сообщение от coderisimo Посмотреть сообщение
у меня там без вариантов, в коллекции обязательно есть TabItem ... но компилятор об этом не знает )))
ну вот, ты и просиял.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
24.06.2012, 12:36
Кстати, еще вопрос про foreach: не знаю, может я тупой или что, но допустим мне надо найти в коллекции определенное значение, я могу сделать 2-3 вложенных for по старинке, могу запустить foreach, и я вынужден пользоваться первым случаем, потому что тогда я не могу получить индексы того элемента, который мне нужен (то есть мне не просто значение нужно, по значению я как раз хочу найти индекс элемента, у которого это значение). Может там есть какая-то встроенная функция? А то получается довольно ограниченное применение: только для копирования и чтения, и то не всех параметров. Например, если я хочу скопировать значения массив (не стандартной процедурой), то мне нужно все равно писать циклы по i,j и копировать, потому что массиву они нужны, а не только само значение..
0
4 / 4 / 0
Регистрация: 28.05.2011
Сообщений: 84
24.06.2012, 12:49  [ТС]
Цитата Сообщение от 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
 Аватар для Lasur
267 / 257 / 43
Регистрация: 18.03.2012
Сообщений: 506
24.06.2012, 13:04
Цитата Сообщение от 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
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
24.06.2012, 14:38
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
 Аватар для Lasur
267 / 257 / 43
Регистрация: 18.03.2012
Сообщений: 506
24.06.2012, 15:30
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
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
24.06.2012, 15:56
Lasur, с LINQ вообще не работал. Так что можно считать, что без for тут не обойтись (все-таки 3 вложенных for легче написать, чем такой код). Но таки с LINQ надо поразбираться. Что посоветуете почитать, чтобы иметь представление? А то большинство книг заканчивается на обработке исключений и делегатах.
0
 Аватар для Lasur
267 / 257 / 43
Регистрация: 18.03.2012
Сообщений: 506
24.06.2012, 17:05
Цитата Сообщение от 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.06.2012, 17:05
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru