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

Удаление повторяющихся записей из массивов

15.01.2015, 15:36. Показов 2326. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Коллеги, помогите пожалуйста. Сломал голову напрочь. Задача следующая: Есть четыре одномерных массива - 2 string, 1 int, 1 double, например:

ФД-133 Петя 1 22,00
МС-155 Маша 2 11,00
ТР-122 Сережа 1 10,00
ИП-111 Катя 3 15,00
ФД-133 Петя 4 22,00
МС-155 Маша 7 11,00
ТР-122 Сережа 5 10,00
ИП-111 Катя 1 15,00

Необходимо получить (Желательно тоже четырьмя массивами):
ФД-133 Петя 5 22,00
МС-155 Маша 9 11,00
ТР-122 Сережа 6 10,00
ИП-111 Катя 4 15,00

Заранее спасибо за помощь.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.01.2015, 15:36
Ответы с готовыми решениями:

Удаление повторяющихся записей
Понимаю, что вопрос заезженный, но меня в первую очередь интересует "почему так получилось?", а потом уже "как быть?". Есть...

Удаление повторяющихся записей
Добрый вечер. Знаю, что до меня создавалась подобная тема, прошу прощения, но нужны ваши свежие ответы. В базе (.mdb) хочу удалить...

Удаление повторяющихся записей
У меня есть табличка : CREATE TABLE `SALES` ( `ID` int(11) NOT NULL auto_increment, `PHONE` char(10) default NULL, `VIN`...

21
 Аватар для Prog_maker
459 / 403 / 153
Регистрация: 23.01.2011
Сообщений: 1,054
15.01.2015, 15:47
Что то я не понял принцип. строковые вывести без повторений, а числовые не понятно
0
0 / 0 / 0
Регистрация: 15.01.2015
Сообщений: 8
15.01.2015, 16:17  [ТС]
Основная колонка - вторая, ее надо сделать без повторов, числовые в третьей - сложить соответственно значениям из второй колонки. вкратце так - первая колонка - партномер, вторая - наименование, третья количество, четвертая - цена, надо сократить данную спецификацию по принципу убрать повторы из второй колонки, цены складывать не надо, надо в сокращенный массив вписать цену соответствующую наименованию на позицию соответсвующую наименованию... как-то так

Добавлено через 24 минуты
в принципе, Distinct<> работает для второй колонки, мне непонятно, как собрать остальные массивы на основании того, что получается из массива [Имя] после Distinct
0
 Аватар для tarasalk
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
15.01.2015, 16:34
Parkinstein, реализуйте свой аналог Distinct. Такто алгоритм простой.
0
0 / 0 / 0
Регистрация: 15.01.2015
Сообщений: 8
15.01.2015, 17:33  [ТС]
Хотелось бы более развернутого ответа.
0
4 / 4 / 2
Регистрация: 06.04.2014
Сообщений: 26
15.01.2015, 18:26
проходишь по третьему массиву, сравниваешь индексы с именнами(0 индекс = ФД-133), запоминаешь имя, опять начинаешь проходить по третьему массиву с 0 до текущего места, и если уже было такое название плюсуешь. Потом лишние эллементы с третьего массива, смотря на первый.
1
 Аватар для tarasalk
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
15.01.2015, 19:18
На всякий случай распишу, а то ответ Snoopy малость непонятный.

Рекомендую юзать списки, чтобы не мучиться с фиксированным размером массивов.
Создаешь 4 списка.
В цикле проходишь по 2-му массиву(с именами).
В каждой итерации проверяешь есть ли такое имя в списке с уникальными именами.
Если нету, то добавляешь во все 4 списка соответствующие данные.
Если есть, то в соответствующий индекс 3 списка прибавляешь число.
1
 Аватар для Prog_maker
459 / 403 / 153
Регистрация: 23.01.2011
Сообщений: 1,054
15.01.2015, 19:40
реализация конечно не супер
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
        static void Main(string[] args)
        {
            string[] partnumber = { "ФД-133", "МС-155", "ТР-122", "ИП-111", "ФД-133", "МС-155", "ТР-122", "ИП-111" };
            string[] name = { "Петя", "Маша", "Сережа", "Катя", "Петя", "Маша", "Сережа", "Катя" };
            int[] kolvo = { 1, 2, 1, 3, 4, 7, 5, 1 };
            double[] price = { 22.00, 11.00, 10.00, 15.00, 22.00, 11.00, 10.00, 15.00 };
 
            for (int i = 0; i < partnumber.Length; i++)
            {
                Console.WriteLine("{0} {1}\t {2} {3:0.00}", partnumber[i], name[i], kolvo[i], price[i]);
            }
 
            Console.WriteLine("\n");
 
            string[] p = partnumber.Distinct().ToArray();
            string[] n = name.Distinct().ToArray();
            double[] pr = price.Distinct().ToArray();
 
            int sum1 = 0, sum2 = 0, sum3 = 0, sum4 = 0;
 
            int[] index1 = partnumber.Select((i, index) => new { i = i, index = index }).Where(i => i.i == "ФД-133").Select(i => i.index).ToArray();
            foreach (var i in index1) sum1 += kolvo[i];
 
            int[] index2 = partnumber.Select((i, index) => new { i = i, index = index }).Where(i => i.i == "МС-155").Select(i => i.index).ToArray();
            foreach (var i in index2) sum2 += kolvo[i];
 
            int[] index3 = partnumber.Select((i, index) => new { i = i, index = index }).Where(i => i.i == "ТР-122").Select(i => i.index).ToArray();
            foreach (var i in index3) sum3 += kolvo[i];
 
            int[] index4 = partnumber.Select((i, index) => new { i = i, index = index }).Where(i => i.i == "ИП-111").Select(i => i.index).ToArray();
            foreach (var i in index4) sum4 += kolvo[i];
 
            int[] k = { sum1, sum2, sum3, sum4 };
 
            for (int i = 0; i < p.Length; i++)
            {
                Console.WriteLine("{0} {1}\t {2} {3:0.00}", p[i], n[i], k[i], pr[i]);
            }
            Console.ReadKey();
        }
Добавлено через 1 минуту
tarasalk, Может уже код напишите
1
0 / 0 / 0
Регистрация: 15.01.2015
Сообщений: 8
15.01.2015, 20:03  [ТС]
Огромное спасибо за помощь, коллеги, завтра попробую реализовать. Сам я в C не местный, посему подтупливаю.
0
 Аватар для tarasalk
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
15.01.2015, 20:19
Prog_maker, пойдет?)
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
string[] partNumber = { "ФД-133", "МС-155", "ТР-122", "ИП-111", "ФД-133", "МС-155", "ТР-122", "ИП-111" };
            string[] name = { "Петя", "Маша", "Сережа", "Катя", "Петя", "Маша", "Сережа", "Катя" };
            int[] count = { 1, 2, 1, 3, 4, 7, 5, 1 };
            double[] price = { 22.00, 11.00, 10.00, 15.00, 22.00, 11.00, 10.00, 15.00 };
 
            List<string> lPartNumber = new List<string>();
            List<string> lName = new List<string>();
            List<int> lCount = new List<int>();
            List<double> lPrice = new List<double>();
 
            bool flag = true;
            for (int i = 0; i < name.Length; i++)
            {
                for (int j = 0; j < lName.Count; j++)
                {
                    if (lName[j] == name[i])
                    {
                        lCount[j] += count[i];
                        flag = false;
                        break;
                    }
                }
 
                if (flag)
                {
                    lPartNumber.Add(partNumber[i]);
                    lName.Add(name[i]);
                    lCount.Add(count[i]);
                    lPrice.Add(price[i]);
                }
            }
 
            for (int i = 0; i < lName.Count(); i++)
            {
                Console.WriteLine("{0} {1}\t {2} {3:0.00}", lPartNumber[i], lName[i], lCount[i], lPrice[i]);
            }
            Console.Read();
1
15.01.2015, 20:32

Не по теме:

tarasalk, нормальная реализация)

0
 Аватар для Prog_maker
459 / 403 / 153
Регистрация: 23.01.2011
Сообщений: 1,054
15.01.2015, 20:35
tarasalk, Отлично!!!!!
1
 Аватар для tarasalk
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
15.01.2015, 20:43
А ведь косяк есть Переменную flag нужно в цикле держать, а то она навсегда false становится.

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
            string[] partNumber = { "ФД-133", "МС-155", "ТР-122", "ИП-111", "ФД-133", "МС-155", "ТР-122", "ИП-111" };
            string[] name = { "Петя", "Маша", "Сережа", "Катя", "Петя", "Маша", "Сережа", "Катя" };
            int[] count = { 1, 2, 1, 3, 4, 7, 5, 1 };
            double[] price = { 22.00, 11.00, 10.00, 15.00, 22.00, 11.00, 10.00, 15.00 };
 
            List<string> lPartNumber = new List<string>();
            List<string> lName = new List<string>();
            List<int> lCount = new List<int>();
            List<double> lPrice = new List<double>();
 
            for (int i = 0; i < name.Length; i++)
            {
                bool flag = true;
                for (int j = 0; j < lName.Count; j++)
                {
                    if (lName[j] == name[i])
                    {
                        lCount[j] += count[i];
                        flag = false;
                        break;
                    }
                }
 
                if (flag)
                {
                    lPartNumber.Add(partNumber[i]);
                    lName.Add(name[i]);
                    lCount.Add(count[i]);
                    lPrice.Add(price[i]);
                }
            }
 
            for (int i = 0; i < lName.Count(); i++)
            {
                Console.WriteLine("{0} {1}\t {2} {3:0.00}", lPartNumber[i], lName[i], lCount[i], lPrice[i]);
            }
            Console.Read();
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
15.01.2015, 21:27
Лучший ответ Сообщение было отмечено Parkinstein как решение

Решение

tarasalk, а вот моя реализация. Перегнать потом значения из анонимных типов труда не составит, думаю. Но кода вышло меньше.
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication2 {
    class Program {
        static void Main(string[] args) {
            string[] partNumber = { "ФД-133", "МС-155", "ТР-122", "ИП-111", "ФД-133", "МС-155", "ТР-122", "ИП-111" };
            string[] name = { "Петя", "Маша", "Сережа", "Катя", "Петя", "Маша", "Сережа", "Катя" };
            int[] count = { 1, 2, 1, 3, 4, 7, 5, 1 };
            double[] price = { 22.00, 11.00, 10.00, 15.00, 22.00, 11.00, 10.00, 15.00 };
 
            var items = Enumerable.Range(0, partNumber.Length)
                .Select((i, j) => new { PartNumber = partNumber[j], Name = name[j], Count = count[j], Price = price[j] })
                .GroupBy(i => i.Name)
                .Select(i => new { Name = i.Key, Count = i.Sum(n => n.Count), 
                                   Price = i.Select(m => m.Price).FirstOrDefault()});
 
            foreach (var i in items) {
                Console.WriteLine(i.ToString());
            }
            Console.ReadLine();
        }
    }
}
2
0 / 0 / 0
Регистрация: 15.01.2015
Сообщений: 8
16.01.2015, 10:33  [ТС]
Вот тут ошибка ловится
Цитата Сообщение от tarasalk Посмотреть сообщение
C#
1
2
3
4
5
6
if (flag)
 {
 lPartNumber.Add(partNumber[i]);
 lName.Add(name[i]);
 lCount.Add(count[i]); // Вне границ диапазона
 lPrice.Add(price[i]);
}
На тестовых данных все массивы содержат по 252 строки, но могут содержать и больше. Может будет понятней, если я объясню, откуда берутся массивы. Может я где-то уже на этом этапе косячу.

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
public void button1_Click(object sender, EventArgs e)
        {
            #region "OpenSourceFile"
            OpenFileDialog openFileDialog1 = new OpenFileDialog();
            openFileDialog1.Filter = "Файлы спецификаций(*.xlsx)|*.xlsx|Файлы спецификаций(*.xls)|*.xls|Все файлы(*.*)|*.*";
            openFileDialog1.Title = "Выбор файла спецификации";
            if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                filename = openFileDialog1.FileName;
                {
                    FileInfo templateFile = new FileInfo(filename);
                    int exept = filename.IndexOf(".");
                    int ostat = filename.Length - exept;
                    string filename2 = filename.Remove(exept) + "_converted.xlsx";
                    FileInfo newFile = new FileInfo(filename2);
                    if (newFile.Exists)
                    {
                        newFile.Delete();
                        newFile = new FileInfo(filename2);
                    }
                    
                    Microsoft.Office.Interop.Excel.Application ObjExcel = new Microsoft.Office.Interop.Excel.Application();
                    Microsoft.Office.Interop.Excel.Workbook ObjWorkBook = ObjExcel.Workbooks.Open(filename, 0, false, 5, "", "", false, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false);
                    Microsoft.Office.Interop.Excel.Worksheet ObjWorkSheet;
                    ObjWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)ObjWorkBook.Sheets[1];
#endregion
                    var lastCell = ObjWorkSheet.Cells.SpecialCells(Microsoft.Office.Interop.Excel.XlCellType.xlCellTypeLastCell);
                    length_mass = lastCell.Row;
                    Range pn = ObjWorkSheet.get_Range("C4","C" + length_mass.ToString());
                    Range it = ObjWorkSheet.get_Range("D4", "D" + length_mass.ToString());
                    Range qa = ObjWorkSheet.get_Range("E4", "E" + length_mass.ToString());
                    Range pr = ObjWorkSheet.get_Range("G4", "G" + length_mass.ToString());
                    System.Array partnums = pn.get_Value(Microsoft.Office.Interop.Excel.XlRangeValueDataType.xlRangeValueDefault);
                    System.Array items_spec = it.get_Value(Microsoft.Office.Interop.Excel.XlRangeValueDataType.xlRangeValueDefault);
                    System.Array quan = qa.get_Value(Microsoft.Office.Interop.Excel.XlRangeValueDataType.xlRangeValueDefault);
                    System.Array pric = pr.get_Value(Microsoft.Office.Interop.Excel.XlRangeValueDataType.xlRangeValueDefault);
                    partnumber = partnums.OfType<object>().Select(o => o.ToString()).ToArray();
                    name = items_spec.OfType<object>().Select(o => o.ToString()).ToArray();
                    kolvo = quan.OfType<int>().Select(i => i).ToArray();
                    price = pric.OfType<double>().Select(i => i).ToArray();
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
16.01.2015, 10:37
Parkinstein, попробуйте мой способ.
Цитата Сообщение от Parkinstein Посмотреть сообщение
На тестовых данных все массивы содержат по 252 строки, но могут содержать и больше.
Эту фразу не понял... Если в массивах будет разное количество элементов, естественно будет ошибка.
1
0 / 0 / 0
Регистрация: 15.01.2015
Сообщений: 8
16.01.2015, 11:07  [ТС]
insite2012, При использовании Вашего способа тоже "Вне границ"
https://db.tt/Ka7d0Qff - Скриншот
Про размеры - размеры массивов между собой одинаковы, разные в зависимости от исходного файла, из которого берутся значения для массивов, т.е. позиций может быть и 252 и 1000 и сколько угодно.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
16.01.2015, 11:26
Цитата Сообщение от Parkinstein Посмотреть сообщение
размеры массивов между собой одинаковы
Быть такого не может. Если все массивы одинаковы по размеру, такая ошибка не вылетит. Единственная причина ее появления - именно несоответствие размера массивов. Поставьте брейк после их заполнения и посмотрите размеры каждого из них.
0
0 / 0 / 0
Регистрация: 15.01.2015
Сообщений: 8
16.01.2015, 11:39  [ТС]
Да, действительно, quantity.Length = 0, остальные по 252.Видимо где-то в получении накосячил, сейчас поищу. Спасибо
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
16.01.2015, 11:42
Цитата Сообщение от Parkinstein Посмотреть сообщение
Видимо где-то в получении накосячил
В общем, я и не сомневался. Эта ошибка только так и появляется. При одинаковом заполнении массивов алгоритм отрабатывает точно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.01.2015, 11:42
Помогаю со студенческими работами здесь

Удаление повторяющихся записей
Здравствуйте! есть запрос, который выбирает повторяющиеся записи SELECT * FROM `test` GROUP BY son, child HAVING COUNT(son)&gt;1 ...

Удаление повторяющихся записей по условию
Есть табличка, 11 полей: возраст, пол, Имя, Фамилия.... Порядка 30000 записей. Необходимо удалить запсиси (дубликаты) имеющие...

Запрос на удаление повторяющихся записей
Помогите пожалуйста есть таблица report (3) в которой есть поле &quot;С номера&quot;, нужно удалить все повторяющиеся записи котороые попадаются в...

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru