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

Что-то пошло не так

21.04.2018, 00:53. Показов 5551. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть 3 массива. Первый - содержит строки файла. Второй - Ник-Нейм. Третий - Число. Необходимо сложить числа у одинаковых ник-неймов. Вроде основную часть написал, но у кода странный вывод, который мне не подходит. Прошу вас помочь.

Полный код:
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
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            string path = "ПУТЬ";
            String[] FileMass = File.ReadAllLines(path);
            if (FileMass.Length <= 3) Console.WriteLine("Недостаточно данных.");
            int[] crd = new int[50];
            String[] plr = new string[50];
 
            for (int i = 1; i < FileMass.Length; i += 2) { crd[i - 1] = int.Parse(File.ReadLines(path).Skip(i).First()); Console.WriteLine(crd[i - 1]); }
            for (int i = 1; i < FileMass.Length; i += 2) { plr[i - 1] = File.ReadLines(path).Skip(i - 1).First(); Console.WriteLine(plr[i - 1]); }
 
            crd = crd.Where(a => a != 0).ToArray();
            plr = plr.Where(x => x != null).ToArray();
       
            int c = 0, s = 1;
            while (c != -28) {
                if (plr[c] == plr[s]) { crd[c] += crd[s]; crd[s] = 0; plr[s] = null; }
                s++;
                if (s > plr.Length - 1) { s = 0; c++; }
                if (c > plr.Length - 1) { c = -28; }
            }
 
            crd = crd.Where(a => a != 0).ToArray();
            plr = plr.Where(x => x != null).ToArray();
 
            foreach (var v in crd) Console.WriteLine(v);
            foreach (var v in plr) Console.WriteLine(v);
 
 
            Console.ReadKey();
 
        }
    }
}
Вывод:
1316
Forsun

Нужно:
Число
Ник
Число2
Ник2
Число3
Ник3

Содержание файла:

Forsun
10
Forsun
100
John
123
Forsun
55
John
123
Forsun
1125
Maik
153
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.04.2018, 00:53
Ответы с готовыми решениями:

Вывод букв на экран, чтото пошло не так
Всем привет Почемуто не работает код на вывод букв на экран Никак не могу разобраться почему, гдето я чтото упустил Прошу помочь и по...

что-то пошло не так
здравствуйте, что-то браузеры лагают,опера вовсе не запускается, а гугл лагает во время переключений вкладок, бывает вплоть до зависания

Что то пошло не так
Доброго времени суток. Собрал компьютер с такой конфигурацией: Материнская плата : MSI H110M PRO-D Процессор : Intel Pentium G4560 ...

20
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
21.04.2018, 01:24
читать про ООП!
0
1741 / 913 / 480
Регистрация: 05.12.2013
Сообщений: 3,074
21.04.2018, 01:26
Цитата Сообщение от Diamante Посмотреть сообщение
читать про ООП!
Не нужно тут ООП, достаточно словарь использовать
0
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
21.04.2018, 01:29
ТабуретY, ну-ка, съимпровизируй со словарем...
время пошло!
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
21.04.2018, 01:56
Зачем тут 3 массива не понятно...
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
            string[] lines = File.ReadAllLines("input.txt");
 
            Dictionary<string, int> output = new Dictionary<string, int>();
 
            for (int i = 0; i < lines.Length; i += 2)
            {
                if (!output.ContainsKey(lines[i]))
                {
                    output[lines[i]] = int.Parse(lines[i + 1]);
                }
                else
                {
                    output[lines[i]] += int.Parse(lines[i + 1]);
                }
            }
 
            foreach (var kv in output)
            {
                Console.WriteLine(kv.Key);
                Console.WriteLine(kv.Value);
            }
0
1741 / 913 / 480
Регистрация: 05.12.2013
Сообщений: 3,074
21.04.2018, 01:58
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
public static void Main(string[] args)
        {
            string path = @"file.txt";
 
            string[] readText = File.ReadAllLines(path);
            
            Dictionary<string, int> names = new Dictionary<string, int>();
            
            for (int i = 0,j=0; i < readText.Length; i+=2) 
            {
                j = i + 1;
                int n = 0;
                if (!names.TryGetValue(readText[i], out n))
                    names[readText[i]] = Convert.ToInt32(readText[j]);
                else{
                    int val = names[readText[i]];
                    names[readText[i]] = val + Convert.ToInt32(readText[j]);
                }
            }
            
            foreach( KeyValuePair<string, int> kvp in names )
            {
                Console.WriteLine("{0}", kvp.Value);
                Console.WriteLine("{0}", kvp.Key);
            }
            
            Console.Write("Press any key to continue . . . ");
            Console.ReadKey(true);
        }
    }
1
0 / 0 / 0
Регистрация: 21.04.2018
Сообщений: 12
21.04.2018, 02:20  [ТС]
Почти то-что нужно, но нужно что-бы с данными можно было работать, что-бы числа были в int и легко доступны.
0
1741 / 913 / 480
Регистрация: 05.12.2013
Сообщений: 3,074
21.04.2018, 03:07
Цитата Сообщение от ForsunJay Посмотреть сообщение
что-бы числа были в int и легко доступны
Так они и так в int и получить их легко

C#
1
int n = names["Forsun"]
0
0 / 0 / 0
Регистрация: 21.04.2018
Сообщений: 12
21.04.2018, 20:14  [ТС]
А если изначально не знаешь имени?
Цитата Сообщение от ТабуретY Посмотреть сообщение
names["Forsun"]
0
1741 / 913 / 480
Регистрация: 05.12.2013
Сообщений: 3,074
21.04.2018, 20:23
Перебрать все имена и найти нужное

C#
1
2
3
4
foreach (string c in names.Keys)
{
    Console.WriteLine(c);
}
0
0 / 0 / 0
Регистрация: 21.04.2018
Сообщений: 12
21.04.2018, 20:31  [ТС]
А если нужен доступ по "ID", то-бишь по номеру как в цикле.
Цитата Сообщение от ТабуретY Посмотреть сообщение
Перебрать все имена и найти нужное
Добавлено через 5 минут
Не получится ли перевести библиотеку в массив по отдельности ключи и значения?
0
 Аватар для Fleder
263 / 224 / 108
Регистрация: 09.12.2015
Сообщений: 652
21.04.2018, 20:32
Цитата Сообщение от ForsunJay Посмотреть сообщение
А если нужен доступ по "ID", то-бишь по номеру как в цикле.
Для этого есть специальная коллекция OrderedDictionary.
0
0 / 0 / 0
Регистрация: 21.04.2018
Сообщений: 12
21.04.2018, 21:01  [ТС]
Как её объявить?

Цитата Сообщение от Fleder Посмотреть сообщение
Для этого есть специальная коллекция OrderedDictionary.
0
 Аватар для Fleder
263 / 224 / 108
Регистрация: 09.12.2015
Сообщений: 652
21.04.2018, 22:23
Цитата Сообщение от ForsunJay Посмотреть сообщение
Как её объявить?
Думаю, это всё-таки не тот случай, когда следует применять эту коллекцию. Бог с ней.

Цитата Сообщение от ForsunJay Посмотреть сообщение
Необходимо сложить числа у одинаковых ник-неймов. Вроде основную часть написал, но у кода странный вывод, который мне не подходит. Прошу вас помочь.
Вы в своём коде использовали LINQ, поэтому вот вам вариант с ними же:
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
using System;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
 
namespace Temp
{
   class Program
   {
      public static void Main(string[] args)
      {
         string path = "file.txt";
 
         //это весь текст из файла
         string text = File.ReadAllText(path);
 
         //это массив кортежей (plr, crd)
         var res = Regex.Matches(Regex.Replace(text, @"\W+", ""), @"([\p{Lu}\p{Ll}]+)(\d+)")
            .Cast<Match>()
            .GroupBy(x => x.Groups[1].Value, x => int.Parse(x.Groups[2].Value))
            .Select(x => (plr: x.Key, crd: x.Sum()))
            .ToArray();
 
         //вот так можно вывести массив
         for(int i = 0; i < res.Length; ++i)
         {
            Console.WriteLine(res[i].crd);
            Console.WriteLine(res[i].plr);
         }
 
         //так можно "разложить" массив кортежей на два массива (это если будет нужно)
         string[] plr = res.Select(x => x.plr).ToArray();
         int[] crd = res.Select(x => x.crd).ToArray();
 
         Console.WriteLine();
         foreach(var v in crd) Console.WriteLine(v);
         foreach(var v in plr) Console.WriteLine(v);
 
         Console.ReadLine();
      }
   }
}
0
0 / 0 / 0
Регистрация: 21.04.2018
Сообщений: 12
21.04.2018, 22:44  [ТС]
Ошибка CS8179 Предопределенный тип "System.ValueTuple`2" не определен и не импортирован.
Поиск не дал ответов которые бы мне помогли.

Цитата Сообщение от Fleder Посмотреть сообщение
Вы в своём коде использовали LINQ, поэтому вот вам вариант с ними же:
0
 Аватар для Fleder
263 / 224 / 108
Регистрация: 09.12.2015
Сообщений: 652
21.04.2018, 22:56
Лучший ответ Сообщение было отмечено ForsunJay как решение

Решение

Цитата Сообщение от ForsunJay Посмотреть сообщение
Ошибка CS8179 Предопределенный тип "System.ValueTuple`2" не определен и не импортирован.
Поиск не дал ответов которые бы мне помогли.
Кортежи доступны начиная с C# 7.0.
Вот версия без кортежей, на анонимных классах:
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
using System;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
 
namespace Temp
{
   class Program
   {
      public static void Main(string[] args)
      {
         string path = "file.txt";
 
         //это весь текст из файла
         string text = File.ReadAllText(path);
 
         //это массив кортежей (plr, crd)
         var res = Regex.Matches(Regex.Replace(text, @"\W+", ""), @"([\p{Lu}\p{Ll}]+)(\d+)")
            .Cast<Match>()
            .GroupBy(x => x.Groups[1].Value, x => int.Parse(x.Groups[2].Value))
            .Select(x => new { Plr = x.Key, Crd = x.Sum() })
            .ToArray();
 
         //вот так можно вывести массив
         for(int i = 0; i < res.Length; ++i)
         {
            Console.WriteLine(res[i].Crd);
            Console.WriteLine(res[i].Plr);
         }
 
         //так можно "разложить" массив кортежей на два массива (это если будет нужно)
         string[] plr = res.Select(x => x.Plr).ToArray();
         int[] crd = res.Select(x => x.Crd).ToArray();
 
         Console.WriteLine();
         foreach(var v in crd) Console.WriteLine(v);
         foreach(var v in plr) Console.WriteLine(v);
 
         Console.ReadLine();
      }
   }
}
Добавлено через 7 минут
Цитата Сообщение от Fleder Посмотреть сообщение
Кортежи доступны начиная с C# 7.0.
И с .NET Framework 4.7
1
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
22.04.2018, 01:15
!посыпаю голову пеплом!, и стоила эта йоплйя отказа от создания класса?
0
 Аватар для Fleder
263 / 224 / 108
Регистрация: 09.12.2015
Сообщений: 652
22.04.2018, 09:35
Цитата Сообщение от Diamante Посмотреть сообщение
!посыпаю голову пеплом!, и стоила эта йоплйя отказа от создания класса?
Может быть и нет.

А если предположить, что файл надо прочитать, обработать и сохранить обратно, и всё это выполняется
в пределах одного метода, тогда нет смысла создавать для промежуточных результатов отдельный тип (на мой взгляд).

Ну а так да, ввести свой класс было бы правильнее.
1
0 / 0 / 0
Регистрация: 21.04.2018
Сообщений: 12
22.04.2018, 12:23  [ТС]
Можно ли как-нибудь отфильтровать значения по возрастанию? (При этом что-бы осталась последовательность Crd-Plr)
Цитата Сообщение от Fleder Посмотреть сообщение
Вот версия без кортежей, на анонимных классах:
0
 Аватар для Fleder
263 / 224 / 108
Регистрация: 09.12.2015
Сообщений: 652
22.04.2018, 12:32
Цитата Сообщение от ForsunJay Посмотреть сообщение
Можно ли как-нибудь отфильтровать значения по возрастанию? (При этом что-бы осталась последовательность Crd-Plr)
По возрастанию свойства Crd:
C#
1
2
3
4
5
6
         var res = Regex.Matches(Regex.Replace(text, @"\W+", ""), @"([\p{Lu}\p{Ll}]+)(\d+)")
            .Cast<Match>()
            .GroupBy(x => x.Groups[1].Value, x => int.Parse(x.Groups[2].Value))
            .Select(x => new { Plr = x.Key, Crd = x.Sum() })
            .OrderBy(x => x.Crd)
            .ToArray();
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.04.2018, 12:32
Помогаю со студенческими работами здесь

Что-то пошло не так
Всем доброго времени суток. Случилась такая беда: частенько при работе с тырнетом приходится переключаться по нескольку раз между...

Что-то пошло не так(
Подскажите пожалуйста! На странице регистрации, появилась надпись &quot;На указанный в форме e-mail придет запрос на подтверждение...

Что-то пошло не так
дано n найти все перестановки я вроде написал, но что то не работает плиз помогите найти ошибку )_/\_ _/\_ #include &lt;stdio.h&gt; ...

Printf + while, что-то пошло не так
Все что выше цикла, проверка WSADATA, сокетов проходит и выводит мне в консоль как надо. Когда клиент заходит в цикл и уже подключился к...

Что то пошло не так с видеокартой
характеристики: БП:FSP Group FSP600-80GLN 600W мать:Gigabyte B75M-D3V проц:i5-2320 озу: 8gb 1337ghz старая видеокарта: asus...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
YAFU@home — распределённые вычисления для математики. На CPU
Programma_Boinc 20.01.2026
YAFU@home — распределённые вычисления для математики. На CPU YAFU@home — это BOINC-проект, который занимается факторизацией больших чисел и исследованием aliquot-последовательностей. Звучит. . .
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru