• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C# System.IndexOutOfRangeException: 'Index was outside the bounds of the array.'

VPS Starter Arubacloud
+1 głos
336 wizyt
pytanie zadane 3 grudnia 2021 w C# przez chrystian Gaduła (4,780 p.)
edycja 6 grudnia 2021 przez chrystian

Mam problem ze zmieniniem stringa w tablice by dostać się do poszczególnych liczb

próbowłem coś takiego

int[] liczba = new value;

cały kod wygłada tak

using System;
using System.IO;
using System.Text;
namespace MyApp // Note: actual namespace depends on the project name.
{
    public class Program
    {
        static String[][] readFile()
        {
            List<String[]> list = new List<String[]>();
            using (StreamReader reader = new StreamReader("identyfikator.txt"))
            {
                while (!reader.EndOfStream)
                {
                    String line = reader.ReadLine();
                    String[] values = line.Split(';');
                    list.Add(values);
                }
            }
            return list.ToArray();
        }
        public static void Main(string[] args)
        {
            string[][] dane = readFile();
            int tym = 0;
            foreach(string[] value in dane)
            {
                
                int lb1 = Convert.ToInt32(value[3]);
                int lb2 = Convert.ToInt32(value[4]);
                int lb3 = Convert.ToInt32(value[5]);
                int lb4 = Convert.ToInt32(value[6]);
                int lb5 = Convert.ToInt32(value[7]);
                int lb6 = Convert.ToInt32(value[8]);
                int suma = lb1 + lb2 + lb3 + lb4 + lb5 + lb6;
                if (suma < tym)
                {
                    Console.WriteLine(dane);
                }
                tym = suma;
            }
           
        }
    }
}

i tu są identyfikatory txt

ACD364321
FYH766322
ERT492157
UCF086201
SER030271
TRE320041
HGJ264015
YIK288424
LOP631028
RFT075953
DYT138710
WER060119
FDG418908
TBG510600
MNG890079
JOL167392
LIK235378
JUY412086
HTU219875
MBF340043
ERD912259
WCD107685
SGR131655
XGJ084352
PKO136517
LMH478546
GYJ959787
TGB561109
NHY113092
UJM387836
KIO581981
PLI365871
UIO477275
LKJ056627
JKJ452719
DET981567
GFG148345
CDW577745
AXA231829
LKJ235181
FHG924487
DCT079589
DER086183
TYG295528
HFG378931
RTY796231
CVB027331
MNO181430
LIK793857
KIK866983
WER952865
TER964506
TRY236153
UTY864724
CRF814379
TDH538122
YKO378648
VBH894666
DAS254002
ZAS415162
SCX213834
ESD135365
FWR584254
OMN109526
KIJ511146
LIH707051
TUR296694
EFG036990
TNB165085
MHK843873
LPE815675
WUO876366
ZVD715396
ZAX109334
CVB607249
RYT039244
DHK003335
PIR418249
ETO496857
WFD066062
WGI346892
IPR713746
WEC895314
WBF946731
WIO271268
PLX004548
NUK840936
JOK786969
GOL154449
TYM328833
KOL217649
KID087253
ROW678778
RTC922708
VFG280453
KOJ323449
LPO417376
MON808968
MJK852644
MHY520831
MUN074761
GTU066476
TYB656560
GYN927179
FGI893005
ORT528531
OKH427482
FJH798557
DRS364324
SEC935528
SWA628895
SZX762072
SZA856237
SFE640377
FCV244480
MBC687402
FSE216318
TUO676428
PIW301254
WER010697
WET389119
WEY850573
WRU800632
WIO734842
WPL828044
EDR742634
EFT594660
RGY851346
TGU192890
THI687663
YJM239548
GVB480875
DFC843230
SXD708566
ZAW575628
ZXC100360
ZSA902488
ZCV895730
XDC817523
XFR625248
BDY301158
TGD745343
MHU718524
JMN132163
HNM335766
KHB054661
NUY603901
GYU054977
TVB188709
GDK547762
RNU029225
RSO172195
RFY418108
UHR073318
VCA004773
ZED159461
SWA502342
SKL488940
SUK909080
SHP387606
YJG090493
NHG048457
NJM488835
NKM248124
NLM123196
NUI963140
NUK363580
NUL744027
NIO427985
NIK304448
DES240539
DAS691188
DXZ894718
DCX533360
DRE267090
RFV834114
GTD057440
NGF331681
NDC280374
BAS307607
BAS974344
BCA165498
DXT501539
DXU650317
DXP453485
RSG131671
RTS278686
RTJ080807
RTY089124
RFV977558
TGB761826
YHN587932
UJM233001
IKL234347
OKJ596607
OUY148489
OTR369174
EYU453631
GEW714200
LOL695279

treść zadania 

Podaj  identyfikatory  (seria+numer)  tych  dokumentów  z  pliku identyfikator.txt, 
których  suma  cyfr  z numerycznejczęścijestnajwiększa.
Odpowiedź zapisz w pliku wyniki4_1.txt,pojednym identyfikatorze w wierszu,
w kolejności zgodnej z kolejnością w  pliku identyfikator.txt. 
W  pliku identyfikator_przyklad.txt  jest  jeden  taki  identyfikator.
 Prawidłowaodpowiedźdlaplikuidentyfikator_przyklad.txt: CHY728985 

 

komentarz 3 grudnia 2021 przez Wiciorny Ekspert (269,120 p.)
   while (!reader.EndOfStream)
                {
                    String line = reader.ReadLine();
                    String[] values = line.Split(';');
                    list.Add(values);
                }

robisz splita z regexem którego nie ma twój plik.
Polecam użyć IDE w którym piszesz i debugować aplikacje 

Bo błąd jest prosty w zrozumieniu odwołujesz się do zakresu tablicy który nie istnieje, tablica jest krótsza niż oczekujesz 

komentarz 3 grudnia 2021 przez chrystian Gaduła (4,780 p.)

czyli 

 String[] values = line;
line.split(values[3])

 

 

 

komentarz 5 grudnia 2021 przez chrystian Gaduła (4,780 p.)

@Wiciorny, Cięzko mi znaleźć błąd wydaje mi się zę jest on w tym ze string value ma jeden indeks jakim jest ACD364321 nie mam pojęcia jak go rozdzielić by każda litera,liczba była w odzielnym indeksie value

komentarz 5 grudnia 2021 przez Wiciorny Ekspert (269,120 p.)
edycja 5 grudnia 2021 przez Wiciorny

najpierw przeczytaj w dokumentacji jak działa metoda split, bo wychodzi na to że totalnie nie wiesz z czego korzystasz.
Split rozdziela ci "podany" string/wyraz ->  na podstawie argumentu który przyjmie tzw. regex.

https://docs.microsoft.com/pl-pl/dotnet/csharp/how-to/parse-strings-using-split

po pierwsze wczytując linie wczytujesz cały ciąg np 

ACD364321

więc to jest twoja linia, jeśli chcesz to podzielić na litery to tak tego nie możesz zrobić w takim razie musisz skorzystać z tej metody toCharArray, z tym że u Ciebie sa również numery :) miej na uwadze  więc tutaj wypadałoby może użyć wyrażenia regularnego. 

niej więcej takie wyrażenie powinno dzielić string na 2 tablice numery osobno i słowa osobno 

(?<=\D)(?=\d)


https://docs.microsoft.com/pl-pl/dotnet/api/system.string.tochararray?view=net-6.0

komentarz 6 grudnia 2021 przez chrystian Gaduła (4,780 p.)
String line = reader.ReadLine();
                    char[] vs = line.ToArray();
                    string[] values = vs;
                    list.Add(values);

Dostaje bład Cannot implicitly cover typ char[] to string []

1 odpowiedź

0 głosów
odpowiedź 8 grudnia 2021 przez VBService Ekspert (251,210 p.)
wybrane 10 grudnia 2021 przez chrystian
 
Najlepsza

Może zamiast 

String line = reader.ReadLine();
                    char[] vs = line.ToArray();
                    string[] values = vs;
                    list.Add(values);

dla pliku

identyfikatory.txt   (dla przykładu pierwsze 10 linii)

ACD364321
FYH766322
ERT492157
UCF086201
SER030271
TRE320041
HGJ264015
YIK288424
LOP631028
RFT075953

użyj po prostu

string[] data = File.ReadAllLines("identyfikator.txt");

 

trzy pierwsze litery możesz usunąć np. za pomocą

string digits = Regex.Replace(line, "^[A-Z]{3}", "");

lub

string digits = line.Substring(3);

 

i zamiast

int lb1 = Convert.ToInt32(value[3]);
int lb2 = Convert.ToInt32(value[4]);
int lb3 = Convert.ToInt32(value[5]);
int lb4 = Convert.ToInt32(value[6]);
int lb5 = Convert.ToInt32(value[7]);
int lb6 = Convert.ToInt32(value[8]);
int suma = lb1 + lb2 + lb3 + lb4 + lb5 + lb6;

możesz użyć taki zapis

int total = 0;
for (int i=0; i<digits.Length; i++)
     total += (int)digits[i] - '0';

 

 

przykład  [ on-line , on-line ]

using System;
using System.IO;

class HelloWorld {
    static void Main() {
        string[] data = File.ReadAllLines("identyfikator.txt");
        int temp = 0;
        
        foreach (string line in data) {
            string digits = line.Substring(3);
            int total = 0;
            for (int i=0; i<digits.Length; i++)
                total += (int)digits[i] - '0';
                
            if (total > temp) {
                Console.WriteLine("{0} {1}", total, line);
                temp = total;
            }
        }
    }
}

 

 

P.S.

Convert char to int ]

komentarz 10 grudnia 2021 przez chrystian Gaduła (4,780 p.)
using System;
using System.Collections.Generic;
using System.Linq;

namespace MyApp // Note: actual namespace depends on the project name.
{
    public class Program
    {

        public static void Main(string[] args)
        {
            string[] data = File.ReadAllLines("identyfikator.txt");
            int suma = 0;
            int tymczasowa = 0;
            foreach (string line in data)
            {
                Console.WriteLine(line);
                string tab = line.Substring(3);
                int lb1 = Convert.ToInt32(tab[0]);
                int lb2 = Convert.ToInt32(tab[1]);
                int lb3 = Convert.ToInt32(tab[2]);
                int lb4 = Convert.ToInt32(tab[3]);
                int lb5 = Convert.ToInt32(tab[4]);
                int lb6 = Convert.ToInt32(tab[5]);
                suma = lb1 + lb2 + lb3 + lb4 + lb5 + lb6;

                Console.WriteLine(suma);
                Console.WriteLine(tab);
                Console.WriteLine(lb1);
                Console.WriteLine(lb4);
                if(tymczasowa > suma)
                {
                    suma = tymczasowa;
                }
            }
            Console.WriteLine(tymczasowa);
        }
    }
}

Mam coś takiego i nie wiem skąd z lb1 bierze się 51 i każda kolejna liczba jest ranodmowa od 40 do 50 

komentarz 10 grudnia 2021 przez chrystian Gaduła (4,780 p.)
@VBService
komentarz 10 grudnia 2021 przez chrystian Gaduła (4,780 p.)
Już mam pierw char Covert na string i to na int
komentarz 10 grudnia 2021 przez VBService Ekspert (251,210 p.)
edycja 10 grudnia 2021 przez VBService

Już mam pierw char Covert na string i to na int

tak o to chodzi, tu jest trik który to "załatwia" ( - '0' )

                string tab = line.Substring(3);
                int lb1 = Convert.ToInt32(tab[0]) - '0';
                int lb2 = Convert.ToInt32(tab[1]) - '0';
                int lb3 = Convert.ToInt32(tab[2]) - '0';
                int lb4 = Convert.ToInt32(tab[3]) - '0';
                int lb5 = Convert.ToInt32(tab[4]) - '0';
                int lb6 = Convert.ToInt32(tab[5]) - '0';
                suma = lb1 + lb2 + lb3 + lb4 + lb5 + lb6;

 

wink  ( on-line )

                Console.WriteLine(line);
                string tab = line.Substring(3);
                for (int i=0; i<tab.Length; i++)
                    suma += (int)tab[i] - '0';
 
                Console.WriteLine(suma);
                Console.WriteLine(tab);
                Console.WriteLine((int)tab[0] - '0');
                Console.WriteLine((int)tab[3] - '0');

 

Convert char to int in C# ]

komentarz 10 grudnia 2021 przez chrystian Gaduła (4,780 p.)

Zadanie do 4.1 

using System;
using System.Collections.Generic;
using System.Linq;

namespace MyApp // Note: actual namespace depends on the project name.
{
    public class Program
    {

        public static void Main(string[] args)
        {
            string[] data = File.ReadAllLines("identyfikator.txt");
            int suma = 0;
            
            int nvm = 0;
            foreach (string line in data)
            {
                
                string tab = line.Substring(3);         
                string l0 = Convert.ToString(tab[0]);
                int lb0 = Convert.ToInt32(l0);
                string l1 = Convert.ToString(tab[1]);
                int lb1 = Convert.ToInt32(l1);
                string l2 = Convert.ToString(tab[2]);
                int lb2 = Convert.ToInt32(l2);
                string l3 = Convert.ToString(tab[3]);
                int lb3 = Convert.ToInt32(l3);
                string l4 = Convert.ToString(tab[4]);
                int lb4 = Convert.ToInt32(l4);
                string l5 = Convert.ToString(tab[5]);
                int lb5 = Convert.ToInt32(l5);
                suma = lb0+lb1+lb2+lb3+lb4+lb5;

                if(suma > nvm) {
                    
                    Console.WriteLine("suma :" + suma);
                    Console.WriteLine("nvm : " + nvm);
                    
                    nvm = suma;
                }
               
                

            }
            Console.WriteLine("----");
            Console.WriteLine(nvm);
            
        }
    }
}

 

1
komentarz 10 grudnia 2021 przez chrystian Gaduła (4,780 p.)

@VBService, Dzięki wielkie

komentarz 10 grudnia 2021 przez chrystian Gaduła (4,780 p.)
edycja 10 grudnia 2021 przez chrystian

@VBService, Dzien dobry robię kolejne zadanie i próboje pana sposób z for lecz ma problem z połaczeniem int ze stringiem by wygladało to tak

int lb6 = Convert.ToInt32(tab[5])

 Kod 

using System;
using System.Collections.Generic;
using System.Linq;

namespace MyApp // Note: actual namespace depends on the project name.
{
    public class Program
    {

        public static void Main(string[] args)
        {
            string[] data = File.ReadAllLines("identyfikator.txt");
            string tym = ' ';
            foreach(string s in data)
            {
                
                string tab = s;
               
                for(int i = 0; i < tab.Length; i++)
                {
                    string ix = Convert.ToString(tab[i]);
                    int b = 0;
                    ix = string.Concat(b);
                    b++; 
                    if(ix[0] == tym[2] && ix[1]== tym[1])
                    {
                        Console.WriteLine(ix + " ! ");
                    }
                    if (ix[3] == tym[8] && ix[4] == tym[7] && ix[5] == tym[6])
                    {
                        Console.WriteLine(ix = " ? ");
                    }
                    tym = ix;
                }
                
            }
        }
    }
}

Treść zadania 

Podaj wszystkie te identyfikatory dokumentów z pliku identyfikator.txt, 
których seria lub numer sąpalindromami, 
czyli czytane od lewej do prawej i od prawej do lewej sątakiesame. Odpowiedź
zapiszw pliku wyniki4_2.txt, 
po jednym identyfikatorze w wierszu, wkolejnościzgodnejzkolejnościąwplikuidentyfikator.txt.
Prawidłowaodpowiedźdlaplikuidentyfikator_przyklad.txt:KOK201272 PIP417543 MOS302203

 

komentarz 11 grudnia 2021 przez VBService Ekspert (251,210 p.)
edycja 11 grudnia 2021 przez VBService

problem z połaczeniem int ze stringiem by wygladało to tak

musisz podać co chcesz połączyć z (w tym przypadku)

string ix = Convert.ToString(tab[i]);
int b = 0;
ix = string.Concat(b);

np:

using System;
class App {
  static void Main() {
        int c = 123321;
        string a = Convert.ToString(c);
        int b = 20;
        
        string d = string.Concat(a,b);
    Console.WriteLine(d);
  }
}

 

ale wydaje Mi się, że możesz to uzyskać w prostszy sposób

 

 

przykład  ( on-line )

using System;
using System.IO;
 
namespace MyApp // Note: actual namespace depends on the project name.
{
    public class Program
    {
 
        public static void Main(string[] args)
        {
            string[] data = File.ReadAllLines("identyfikator.txt");
            
            for (int i=0; i<data.Length; i++) {
                string id_letters = data[i].Substring(0,3);
                
                if (id_letters[0] == id_letters[2])
                    Console.WriteLine(" W lini {0,3} występuje palidrom (seria) {1}", i+1, id_letters);
            }
            
            Console.WriteLine();
            
            for (int i=0; i<data.Length; i++) {
                string id_number = data[i].Substring(3);
                
                if ((id_number[0] == id_number[5]) &&
                    (id_number[1] == id_number[4]) &&
                    (id_number[2] == id_number[3]))
                    Console.WriteLine(" W lini {0,3} występuje palidrom (numer) {1}", i+1, id_number);
            }            
        }
    }
}

 

Podobne pytania

0 głosów
1 odpowiedź 235 wizyt
0 głosów
2 odpowiedzi 1,908 wizyt
pytanie zadane 25 czerwca 2020 w Java przez Paweł123 Nałogowiec (33,500 p.)
0 głosów
0 odpowiedzi 241 wizyt
pytanie zadane 8 maja 2016 w C# przez Szygnik Początkujący (340 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...