C# Spara data från fil till en klass.

Permalänk
Medlem

C# Spara data från fil till en klass.

Tjena. Jag håller på med en uppgift där jag ska skapa ett program som kontrollerar ifall en användare har ett giltigt Guldkort.
Guldkortet innehåller 4 olika karaktären som belöning. Dessa belöningar kan tilldelas till en användare om användarens kortdata som användardata är giltigt.
Jag har ett annat program som kommunicerar med mitt server program som en klient. Detta klient program skicka enstaka strängar till mitt serverprogram enligt följande format. A8656186-K117247315. Mitt program ska kunna dela på informationen till två separata strängar och testa dessa nya strängar mot en fil innehållande lista med kunddata och en fil innehållande med kortdata.
Kunddatans format i filen A1234567###Jason Bourne###Stockholm. Kortdatans format i filen, K123456789###Kristallhäst.

Mitt Huvudsakliga problem jag stött på är att jag inte lyckas lägga till kortdata egenskaper till User klassen utan det läggs bara till för senast skapad User.
Hur lyckas jag även skapa nya strängar av den information jag får inom strängen message från TCP klienten som jag sedan ska jämföra med User klassen som kontrollerar om en User finns eller inte.

Koden är långt ifrån klar och oorganiserad:

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.IO; using System.Net; using System.Net.Sockets; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace Guldkortet { public partial class Form1 : Form { TcpClient client; TcpListener listener; int port = 12345; List<User> userData = new List<User>(); //Mesage tar emot bytedata och konverteras till Unicode sträng. string message; string data; //Splittad sträng från NOS_export lagras vector. string[] vector; public Form1() { InitializeComponent(); //client.NoDelay = true; // User object StreamReaderUserData(userData); } private void BtnConnect_Click(object sender, EventArgs e) { try { listener = new TcpListener(IPAddress.Any, port); listener.Start(); } catch (Exception error) { MessageBox.Show(error.Message, Text); return; } { BtnConnect.Enabled = false; StartReceiver(); // StartReceiver() HERE !! } } public async void StartReceiver() { try { client = await listener.AcceptTcpClientAsync(); } catch (Exception error) { MessageBox.Show(error.Message, Text); return; } StartReader(client); // StartReader() HERE !! } public async void StartReader(TcpClient c) { byte[] buffert = new byte[1024]; int n = 0; try { n = await c.GetStream().ReadAsync(buffert, 0, buffert.Length); message = Encoding.Unicode.GetString(buffert, 0, n); } catch (Exception error) { MessageBox.Show(error.Message, this.Text); return; } StartReader(c); data = message; // Splittar på datan som skickas från NOS_export. SplitterCheckData(data, userData); } //splits message into two strings and compares the data with the strings in the list. public void SplitterCheckData(string data, List<User> list) { List<string[]> cData = new List<string[]>(); vector = data.Split(new string[] { "-" }, StringSplitOptions.None); cData.Add(vector); foreach (string[] item in cData) { ReturnData.AppendText(item[0] + " SEPARATOR " + item[1] + "\r\n"); } } // Opens a path to directed file public void StreamReaderUserData(List<User> list) { User newUser; string item = ""; string[] vektor; List<string> userSaver = new List<string>(); List<string[]> strVektor = new List<string[]>(); StreamReader reader = new StreamReader("kundlista.txt", Encoding.Default, true); if (File.Exists("kundlista.txt")) { while ((item = reader.ReadLine()) != null) userSaver.Add(item); foreach (string s in userSaver) { vektor = s.Split(new string[] { "###" }, StringSplitOptions.None); strVektor.Add(vektor); newUser = new User(); list.Add(newUser); newUser.UserNumber = vektor[0]; newUser.Name = vektor[1]; newUser.City = vektor[2]; } // Strömmen strängs. reader.Close(); } } public void StreamReaderCardData(List<User> list) { User newUser; string item = ""; string[] vektor; List<string> userSaver = new List<string>(); List<string[]> strVektor = new List<string[]>(); StreamReader reader = new StreamReader("kortlista.txt"); } private void BtnLoadList_Click(object sender, EventArgs e) { LbReturnData.Items.AddRange(userData.ToArray()); } } public class User { public string UserNumber { get; set; } public string CardNumber { get; set; } public string Name { get; set; } public string City { get; set; } public string GoldCard { get; set; } public override string ToString() { return UserNumber + "-" + CardNumber + " " + Name + ". From " + City + " || " + GoldCard; } } public class GoldCard { public string Health { get; set; } public string Power { get; set; } public string ElementalSkill { get; set; } } public class Dunderkatt : GoldCard { public override string ToString() { return base.ToString(); } } public class Kristallhäst : GoldCard { public override string ToString() { return base.ToString(); } } public class Överpanda : GoldCard { public override string ToString() { return base.ToString(); } } public class Eldtomat : GoldCard { public override string ToString() { return base.ToString(); } } }

Permalänk
Medlem

Förstår inte riktigt ditt problem av det du har skrivit.
Men jag utgår från din titel och gör ett antagande vad du vill göra.

Vill du läsa in och skapa upp object av User från en txt fil, korrekt? För spara fil till klass låter lite skumt, man läser in en fil eller skriver till en fil.

Som det ser ut nu i metoden
public void StreamReaderUserData(List<User> list)
Skickar du in en Lista av Users, läser upp en .txt fil. Loopar igenom och skapar upp Users, addar det i listan du har skickat in. Sen returnar du aldrig något från metoden, den är void.
Så alla users du skapar upp här och addar i listan kommer försvinna.

Om du istället läser upp alla users och returnar en lista skulle du skulle skriva t.ex.
public List<User> StreamReaderUserData() // Metoden returnar en List<User> istället för void.
var userList = StreamReaderUserData();

sen har du alla users i userList.
Men jag vet inte om det var detta du menade?

Sen ja, koden är otroligt rörig vilket gör att det är svårt att läsa och förstå vad du menar.
Du har dina domain klasser, TcpClients och Filläsning i samma fil just nu (SOLID)

korrigering
Permalänk
Medlem

@zaibuf: Tack för svar. Alltså, jag vill få in egenskaper från två filer till User klassen, När jag öppnat filen med kunddata och lagt till i User klassens egenskaper vet jag inte riktigt hur jag ska gå till väga för att lägga till info från den andra filen till egenskaperna cardNumber och goldCard från kortlista.txt filen. Eftersom en ny user skapas för varje gång en rad i filen splittas och läggs till i en strängvektor-lista så är det den senast skapade usern som tilldelas dessa egenskaper från kortlista.txt filen...
Jag ska lägga till att returnera en lista istället, bra förslag. Varje user sparas i List<User> userData. Dem försvinner inte.

Permalänk
Medlem

@virree97: De sparas eftersom en lista är en "reference type". Motsatsen till reference type är value type.

Så det personen ovan skrev om att Users försvinner stämmer inte eftersom det är just en reference type. Men du hade ju redan insett att de inte försvann

Permalänk
Medlem
Skrivet av Forsgren:

@virree97: De sparas eftersom en lista är en "reference type". Motsatsen till reference type är value type.

Så det personen ovan skrev om att Users försvinner stämmer inte eftersom det är just en reference type. Men du hade ju redan insett att de inte försvann

Man lär sig något nytt, trodde att man var tvungen att skriva ref List<User> userlist för att hänvisa att det är ref. Men det kanske bara gäller value types då. Good to know!
Jag hade ändå låtit metoden i sig returna en lista istället för att skicka in en som ska fyllas. Kanske därför jag inte visste att detta fungerade

Skrivet av virree97:

@zaibuf: Tack för svar. Alltså, jag vill få in egenskaper från två filer till User klassen, När jag öppnat filen med kunddata och lagt till i User klassens egenskaper vet jag inte riktigt hur jag ska gå till väga för att lägga till info från den andra filen till egenskaperna cardNumber och goldCard från kortlista.txt filen. Eftersom en ny user skapas för varje gång en rad i filen splittas och läggs till i en strängvektor-lista så är det den senast skapade usern som tilldelas dessa egenskaper från kortlista.txt filen...
Jag ska lägga till att returnera en lista istället, bra förslag. Varje user sparas i List<User> userData. Dem försvinner inte.

Så du har en .txt fil med Users och en med Kort? Hur är de länkade, stämmer raderna överens eller går de efter något ID?
Alltså är rad 1 i User = Rad 1 i Kort ?

Nu var det sjukt länge sedan jag jobbade med just .txt filer. Men enklast är väl om du läser in hela innehållet i en valfri from av IEnumerable och sedan loopar igenom den och länkar dem efter ID/RAD.

Du skulle annars kunna göra som du gör nu, skapar upp dina Users från sin fil.
Sen startar du en reader från andra filen där du loopar din UserLista och sätter props på det du läser upp därifrån.

Permalänk
Medlem
Skrivet av Forsgren:

@virree97: De sparas eftersom en lista är en "reference type". Motsatsen till reference type är value type.

Så det personen ovan skrev om att Users försvinner stämmer inte eftersom det är just en reference type. Men du hade ju redan insett att de inte försvann

Skrivet av zaibuf:

Man lär sig något nytt, trodde att man var tvungen att skriva ref List<User> userlist för att hänvisa att det är ref. Men det kanske bara gäller value types då. Good to know!
Jag hade ändå låtit metoden i sig returna en lista istället för att skicka in en som ska fyllas. Kanske därför jag inte visste att detta fungerade

Mja då kvittar det ju om jag matar in eller returnerar en lista.
Jag lyckas fortfarande inte lägga till från textfilen kortlista.txt de egenskaper som hör till newUser.cardNumber och newUser.goldCard.
Behöver lägga till i samtliga users i listan userData. MEN endast den senast skapade usern får värdena från textfilen.

Permalänk
Medlem

@zaibuf:

Ja, om en lista ska skapas utifrån denna textfil som det pratas om hade även jag nog valt att returnera en lista istället för att skicka in en som ska populeras.