Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.10.2015, 17:20   #1
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию Как сформировать массив, который будет дополнять значения другого массива, С#

Мне нужно 149 значений распределить по 2 массивам pilots и datas.
Я задаю, например, массив pilots = { 1, 2, 3, 4, 5, 6 , 7, 14, 21, 28 }; тогда мне нужно сделать так, чтобы в массиве datas было следующее: datas = {8, 9,10,11,12,13,15:20,22:27, 29:149}.
Как эту задачу наиболее просто и оптимально сделать на C#? Я что-то пробовал сделать, но пока безуспешно;(
Код:
int[] pilots = { 1, 2, 3, 4, 5, 6 , 7, 14, 21, 28 };
                    int ndatas = 170 - pilots.Length; int[] datas = new int[ndatas]; int iii = 1;
                    for (i = 1; i < 150; i = i++)
                    {
                        for (int ii = 0; ii < pilots.Length; ii++)
                        {
                            if (i + 1 != pilots[ii]) { datas[iii] = i + 1; iii++; }
                        }
                    }
Ок, подробнее.
Код:
int[] pilots = { 1, 2, 3, 4, 5, 6 , 7, 14, 21, 28 };
                    int ndatas = 150 - pilots.Length; int[] datas = new int[147]; int iii = 0;
                    for (i = 1; i <= 150; i++)
                    {
                        if (i != pilots[0] && i != pilots[1] && i != pilots[2])
                        {
                            datas[iii] = i;
                            iii++;
                        }
                    }
Этот код работает корректно и если i становится равным одному из элементов массива pilots, это значение пропускается в массиве datas. Мне как раз одного штриха не хватает, как можно заменить строчку
Код:
               if (i != pilots[0] && i != pilots[1] && i != pilots[2])
так, чтобы код учитывал любое количество элементов, которые я добавлю в массив pilots, учитывал их все. Нужен своеобразный for. Либо предлагайте свои варианты

Последний раз редактировалось Stilet; 15.10.2015 в 18:52.
Krasi вне форума Ответить с цитированием
Старый 15.10.2015, 19:08   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
            int[] pilots = { 1, 2, 3, 4, 5, 6 , 7, 14, 21, 28 };
            int[] datas = new int[150];
            var a = datas.Select((i, v) => new { i, v }).Where(n=>pilots.Count(k=>k==n.v)==0).Select(q=>q.v);
            foreach (var l in a) { Console.Write("{0} ", l); }
            Console.ReadKey();
Угадал?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.10.2015, 10:16   #3
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Я пока не могу понять, угадали или нет, потому что у меня так все работает, то есть код должен работать так:
Код:
int[] pilots = { 37, 74, 111, 148 };
                    int ndatas = 150 - pilots.Length; int[] datas = new int[150 - pilots.Length]; int iii = 0;
                    for (i = 1; i <= 150; i++)
                    {
                        if (i != pilots[0] && i != pilots[1] && i != pilots[2] && i != pilots[3])
                        {
                            datas[iii] = i;
                            iii++;
                        }
                    }
А когда я в своем коде закомментировал строчку datas[iii] = i; и добавил в самом конце
Код:
var a111 = datas.Select((i111, v) => new { i111, v }).Where(n111 => pilots.Count(k => k == n111.v) == 0).Select(q => q.v);
то все элементы datas просто стали равны 0, как будто их не изменяли. А что делает эта строчка?
Krasi вне форума Ответить с цитированием
Старый 16.10.2015, 10:24   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
А что делает эта строчка?
Запрос? Отбирает значения из массива, те, что не принадлежат второму массиву.
Хотя наверно я погорячился, можно было бы через join или intersect попробовать...
У меня мой пример работал.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.10.2015, 11:42   #5
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Сделать pilots не массивом, а List<int> (или HashSet<int>, в зависимости от задачи) и вызывать метод Contains. Или использовать Array.IndexOf (-1 если не найден)
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 16.10.2015, 16:09   #6
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Код:
var a111 = datas.Select((i111, v) => new { i111, v }).Where(n111 => pilots.Count(k => k == n111.v) == 0).Select(q => q.v);
А подробнее? Где нужно смотреть результат, то есть массив, в котором нет выборок pilots?

У меня тоже ошибки не выдает. Но и datas не формирует.
Я решил, что значит мне надо сформировать datas, который будет включать всевозможные значения: datas = [1:150], а потом Ваш код вырежет с этого массива, например, числа 7, 14 и 21.
Но я попробовал так, смотрю переменную datas, значения 7, 14 и 21, содержащиеся в pilots, остались и в datas. a var111 я не очень понимаю, если результат в ней, то как его посмотреть?
Krasi вне форума Ответить с цитированием
Старый 16.10.2015, 16:26   #7
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Да забейте на этот код и сделайте со своим то, что выше написано.

Цитата:
var111 я не очень понимаю, если результат в ней, то как его посмотреть?
Ну так же как и datas смотреть.
Можно .ToArray() в конце добавить если именно массив нужен.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 16.10.2015, 17:05   #8
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Alex11223, я пока хочу с примером Stilet разобраться, а потом попробую.
Stilet, я забыл сказать, что мне не нужен 0 в массиве. У меня сейчас все заработало, но вот решил я избавится от 0, и что-то пошло не так. Ноль все-равно появляется. Это я виноват, или как-то надо изменить строчку?

Код:
 int[] pilots = { 37, 74, 111, 148 };
                    int dat_and_pil = 75; int ndatas = dat_and_pil - pilots.Length; int[] datas = new int[ndatas];

                    int[] datas1 = new int[dat_and_pil]; for (i = 0; i < dat_and_pil; i++) { datas1[i] = i + 1; }
                    
                    var a111 = datas1.Select((i111, v) => new { i111, v }).Where(n111 => pilots.Count(k => k == n111.v) == 0).Select(q => q.v);
                    datas = a111.ToArray();
Krasi вне форума Ответить с цитированием
Старый 16.10.2015, 17:20   #9
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Код:
            var pilots = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 14, 21, 28 };

            var datas = Enumerable.Range(1, 149)
                .Where(val => !pilots.Contains(val))
                .ToArray();
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 16.10.2015, 18:14   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Enumerable.Range(1, 149)
А-А-А!!! Машувать, вот что я никак не мог вспомнить! Помнил же что был метод искусственного наполнения массива последовательностью, но елыпалы вспомнить не смог, и нагородил жуткий запрос...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сформировать новый массив из элементов массива, значения которых = 0 Liori Общие вопросы C/C++ 2 02.01.2015 17:54
Дан одномерный массив из 30 элементов. Сформировать второй массив, в котором сначала идут все элементы первого массива, кратные 5, Olzhakesh C# (си шарп) 1 29.04.2014 23:49
Дан массив X(N,M).Найти номера столбцов массива,все элементы которых четны. Из полученных значений сформировать одномерный массив. darwin1 Паскаль, Turbo Pascal, PascalABC.NET 3 16.03.2014 13:31
Как создать запрос, который будет размножать листы TimeStopper Microsoft Office Excel 9 11.09.2012 12:40
Сформировать массив из десяти элементов, вычислить значения. kuholor Помощь студентам 1 23.11.2010 21:37