Archief - C# Vergelijking loopt fout

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

wartaal

Legacy Member
Dus...

Ik moet een soort van programma maken waarmee je feeds kan aanmaken, aanpassen en verwijderen.

Nu heb ik er een stukje code ingezet die moet controleren of de feed al niet bestaat met dezelfde naam. Als ik het test, is er het bij aanmaken van 1 feed geen enkel probleem. Maar als ik dan nog een feed aanmaak. Dan krijg ik deze error;

"NullReferenceExpention was unhandled"

Blijkbaar wil hij mijn object (aangemaakte feed) niet meer vinden ofzo...

Weet dus echt niet meer wat ik zou moeten doen.

Hier is de code van mijn aanmaken van een feed:

Code:
  private void button2_Click_1(object sender, EventArgs e)
        {
            if (findFeed(textBox1.Text) > 0)
            {
                Feed NewFeed = new Feed();
                NewFeed.STitle = textBox1.Text;
                NewFeed.SCopy = textBox2.Text;
                NewFeed.SPubdate = textBox4.Text;
                FeedList1.Items.Add(NewFeed);
                Feeds[NumFeeds++] = NewFeed;
               
            }

en van de vergelijking:

Code:
 private int findFeed(string NewFeed)
        {
            for (int i = 0; i < NumFeeds; i++)
            {
                if (Feeds[i].STitle.ToLower() == NewFeed.ToLower())
                {
                    return i;
                }
            }
            return -1;
        }

MennovdH

Legacy Member
wartaal,

Op welke lijn code krijg je je error precies? Ik veronderstel dat het gaat over :

if (Feeds.STitle.ToLower() == NewFeed.ToLower())

Klopt dat?
In dat geval is duidelijk je NumFeeds variabele hoger dan het aantal feeds in je array. Ik zie niet waar je je NumFeeds initialiseert, en weet dus ook niet het precieze verloop ervan.
Is het trouwens mogelijk dat je een foutje hebt gemaakt bij het kopiëren van je code: je findFeed method geeft -1 terug als je feed niet gevonden is, en in je button event handler voeg je enkel een feed toe als je findFeed method return hoger is dan 0. Het lijkt logischer dat je een feed toevoegt als hij niet al bestaat (dus return is kleiner dan 0).

Hieronder nog een paar andere bedenkingen:
- Waarom gebruik je geen generic list (List<Feed> Feeds = new List<Feed>(); ). Dan zou je gewoon je feeds kunnen toevoegen, en je Count property gebruiken om te overlopen.
- Het vergelijken van strings zoals jij het doet is redelijk traag. Het volgende is efficiënter: if (String.Equals(Feeds.STitle, NewFeed, StringComparison.CurrentCultureIgnoreCase))


Menno

wartaal

Legacy Member
Hey,

Klopt inderdaad, dat de fout op die lijn code gebeurt.

Mijn NumFeed:

Code:
private int NumFeeds = 0;

En nu ga ik nog eens testen met jou uitleg erbij, echt bedankt!

wartaal

Legacy Member
Hmm, er loopt dus nog steeds iets fout.

Ik zal eens mijn hele code posten.

Code:
 private Item[] Feeds = new Feed[100];

        private int NumFeeds = 0;

        private string[] cat = new string[99];

        private string[] Cats = new string[99];

        private string currentDirectory;

Code:
private int findFeed(string NewFeed)
        {
            for (int i = 0; i < NumFeeds; i++)
            {
                if (String.Equals(Feeds[i].STitle, NewFeed, StringComparison.CurrentCultureIgnoreCase))

                {
                    return i;
                }
            }
            return -1;
        }

Code:
private void button2_Click_1(object sender, EventArgs e)
        {
            if (findFeed(textBox1.Text) > 0)
            {
                Feed NewFeed = new Feed();
                NewFeed.STitle = textBox1.Text;
                NewFeed.SCopy = textBox2.Text;
                NewFeed.SPubdate = textBox4.Text;
                FeedList1.Items.Add(NewFeed);
                Feeds[NumFeeds++] = NewFeed;
               
            }

 if (textBox1.Text != "")
            {
                FeedList1.Items.Add(textBox1.Text);
                StreamWriter catSaver = new StreamWriter(currentDirectory + "\\Users\\UGent\\Desktop\\Feeds.fed");
                NumFeeds = FeedList1.Items.Count;
                for (int i = 0; i < FeedList1.Items.Count; i++)
                {
                    cat[i] = FeedList1.Items[i].ToString();
                    catSaver.WriteLine(cat[i]);
                }
                catSaver.Close();
            }
            else
            {
                 FeedList1.SelectedItem.ToString();
            }

Code:
private void Form1_Load(object sender, EventArgs e)
        {
            currentDirectory = Directory.GetCurrentDirectory();
            Directory.CreateDirectory(currentDirectory + "\\feeds\\");
            string[] FeedFiles = Directory.GetFiles(currentDirectory + "\\feeds\\", "*.feed");

            

            if (File.Exists(currentDirectory + "\\feeds.fed"))
            {
                StreamReader catReader = new StreamReader(currentDirectory + "\\feeds.fed");
                while (!catReader.EndOfStream)
                {
                    FeedList1.Items.Add(Feeds[NumFeeds++]);
                }
                catReader.Close();
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (FeedList1.SelectedItem != null)
            {
                int i = findFeed(FeedList1.SelectedItem.ToString());
                if (i >= 0)
                {
                    Feeds[i].Delete();
                    for (int j = i + 1; j < NumFeeds; j++)
                        Feeds[j - 1] = Feeds[j];
                    NumFeeds--;
                }
                FeedList1.Items.RemoveAt(FeedList1.SelectedIndex);
            }
            else
            {
                MessageBox.Show("Please select a feed.", "No feed selected!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

Pfff, ik heb me helemaal rotgezocht. Waarom geven ze ook dit soort oefeningen aan iemand die C# pas 4 maanden aan het leren is.

Zapp

Legacy Member
Moet:
String.Equals(Feeds.STitle, NewFeed, StringComparison.CurrentCultureIgnoreCase
niet hetvolgende zijn:
String.Equals(Feeds.STitle, NewFeed.STitle, StringComparison.CurrentCultureIgnoreCase

Anders ga je je titel vergelijken met het hele object, toch?

wartaal

Legacy Member
Ander vraagje.

Mijn admin werkt nu ongeveer juist.
Maar nu wil ik de data van mijn admin ophalen en plaatsen in een tektbox van de app die de feeds toont aan de bezoeker.
Ik dacht ergens ophalen uit een directory, maar geen idee hoe. Mijn feeds worden opgeslagen in een feed.fed bestand.

Iemand die me een beetje op weg kan helpen?
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan