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

Odczyt z pliku do dwóch różnych zmiennych w C#

Object Storage Arubacloud
+1 głos
425 wizyt
pytanie zadane 21 marca 2021 w C# przez piter11251 Obywatel (1,280 p.)

Sprawa wygląda tak, że chciałbym odczytać z pliku tekstowego nazwe zespołu i punkty, a nastepnie móc to posortować malejąco. Myślałem, żeby zapisać to do dwóch zmiennych i zrobić wtedy miedzy nimi jakąś relacje (o ile to możliwe), aby móc posortować to tak, że drużyna jest skojarzona z ilością punktów jakie posiada. Chyba ze jest na to prostsza metoda, np. osobna biblioteka.

public void DisplayRanking()
        {
            string[] lines = File.ReadAllLines("teams.txt");
            foreach(var line in lines)
            {
                Console.WriteLine(line);
            }
        }

Kod nie jest żaden wymyślny, natomiast nie mam pojecia jak móc zrobić to co opisałem wyżej

2 odpowiedzi

+2 głosów
odpowiedź 23 marca 2021 przez Paweł Nyczkowski Obywatel (1,620 p.)
wybrane 23 marca 2021 przez piter11251
 
Najlepsza

podsumowując odpowiedź kolegi areklipno

List<Wyniki> wyniki = new List<Wyniki>();
		var lines = File.ReadAllLines("TeamsUEFA.txt");
		foreach (var line in lines)
		{
			Wyniki wynik = new Wyniki();
			decimal wartosc = 0;
			string[] pola = line.Split(' ');
			string punkty = pola[pola.Length - 1];// ostatnia wartość to wynik


			if (decimal.TryParse(punkty, out wartosc))
				wynik.Wynik = wartosc;

			wynik.Druzyna = line.Substring(0, line.Length - punkty.Length);
			wyniki.Add(wynik);
		}

 

komentarz 23 marca 2021 przez piter11251 Obywatel (1,280 p.)

Skorzystałem z twojego kodu, natomiast dziwna rzecz się dzieje, ponieważ jak wyświetlam tą listę to pokazuje mi się test1.Wyniki gdzie test1 to nazwa programu(testowy do sprawdzenia jak to dziala) i tych napisów jest dokładnie tyle samo co linii w pliku. Po wstepnym przejrzeniu kodu i zakomentowaniu zarówno

 if (decimal.TryParse(punkty, out wartosc))
                wynik.Wynik = wartosc;

jak i

 wynik.Druzyna = line.Substring(0, line.Length - punkty.Length);

cały czas wyświetlane jest test1.Wyniki.

komentarz 23 marca 2021 przez Paweł Nyczkowski Obywatel (1,620 p.)
gdzie się pojawia "test1.Wyniki" ? co oznacza wyświetlanie listy?
komentarz 23 marca 2021 przez piter11251 Obywatel (1,280 p.)

Po wykonaniu się pętli foreach postanowiłem wyświetlić sobie zawartość listy wyniki za pomocą

wyniki.ForEach(Console.WriteLine);

I wyświetliło mi sie coś takiego:
test1.Wyniki

test1.Wyniki

test1.Wyniki

test1.Wyniki

test1.Wyniki

komentarz 23 marca 2021 przez Paweł Nyczkowski Obywatel (1,620 p.)

podmień klasę Wyniki i daj znać jak się wyświetla wynik

public class Wyniki
{
	public string Druzyna { get; set; }
	public decimal Wynik { get; set; }

  public override string ToString()
  {
    return Druzyna+" " + Wynik;
  }
}

 

komentarz 23 marca 2021 przez piter11251 Obywatel (1,280 p.)

Wybacz ze za bardzo nie kumam, ale jak mam zrobić podmiane tej klasy? Dodam jeszcze że ten programik wykonuje sie w funkcji, która znajduje sie w klasie Wynik i wywołuję ją w Mainie.

Main:

class Program
    {
        static void Main(string[] args)
        {
            Wyniki x = new Wyniki();
            x.JakasFunkcja();
        }
    }

Wyniki.cs:
 

public class Wyniki
    {
        public string Druzyna { get; set; }
        public decimal Wynik { get; set; }
        public void JakasFunkcja()
        {
            List<Wyniki> wyniki = new List<Wyniki>();
            var lines = File.ReadAllLines("TeamsUEFA.txt");
            foreach (var line in lines)
            {
                Wyniki wynik = new Wyniki();
                decimal wartosc = 0;
                string[] pola = line.Split(' ');
                string punkty = pola[pola.Length - 1];
                if (decimal.TryParse(punkty, out wartosc))
                    wynik.Wynik = wartosc;
                wynik.Druzyna = line.Substring(0, line.Length - punkty.Length);
                wyniki.Add(wynik);
            }
        }
            public override string ToString()
            {
            return Druzyna + " " + Wynik;
            }
        }

 

komentarz 23 marca 2021 przez Paweł Nyczkowski Obywatel (1,620 p.)

robienie całej logiki w jednej klasie która sama do siebie się odwojuje jest bardzo złą praktyką

jednak poniżej rozwiązanie uwzględniające tą złą praktykę

public class Wyniki
{
	public string Druzyna { get; set; }
	public decimal Wynik { get; set; }

  public override string ToString()
  {
    return Druzyna+" " + Wynik;
  }

	public static void t5()
	{
		List<Wyniki> wyniki = new List<Wyniki>();
		var lines = File.ReadAllLines(@"d:\TeamsUEFA.txt");
		foreach (var line in lines)
		{
			Wyniki wynik = new Wyniki();
			decimal wartosc = 0;
			string[] pola = line.Split(' ');
			string punkty = pola[pola.Length - 1];// ostatnia wartość to wynik


			if (decimal.TryParse(punkty, out wartosc))
				wynik.Wynik = wartosc;

			wynik.Druzyna = line.Substring(0, line.Length - punkty.Length);
			wyniki.Add(wynik);
		}

		wyniki.ForEach(Console.WriteLine);
	}
}

zadanie można wywołać w oknie Immediate  (menu Debug=>Windows=>Immediate)
Wyniki.t5() + ENTER

 

 

 

komentarz 23 marca 2021 przez piter11251 Obywatel (1,280 p.)
Działa tak jak powinno, bardzo dziękuję za pomoc i cierpliwość!
+1 głos
odpowiedź 22 marca 2021 przez areklipno Stary wyjadacz (11,930 p.)

wg mnie należy zrobić klasę wyglądającą np. tak:

public class Wyniki {

public string Druzyna {get;set;}
public decimal Wynik {get; set;}

}

Dane z pliku dodałbym do listy. Posortowanie tego później byłoby banalne - za pomocą LINQ.

List<Wyniki> wyniki = new List<Wyniki>();

///tutaj dodanie danych do listy

//wyświetlenie wyników posorotowanych np. tak

foreach(Wyniki wynik in wyniki.OrderBy(x=>x.Wynik) )
{
   Console.WriteLine( wynik.Druzyna + " --> " + wynik.Wynik);
}


//lub malejąco

foreach(Wyniki wynik in wyniki.OrderByDescending(x=>x.Wynik) )
{
   Console.WriteLine( wynik.Druzyna + " --> " + wynik.Wynik);
}


 

PS. Mam nadzieję, że nie zrobiłem literówek - kodu nie sprawdzałem w VS.

komentarz 22 marca 2021 przez piter11251 Obywatel (1,280 p.)

Bardzo ciekawy pomysł!
Spróbowałem go zrealizować, tylko że wywala error: nie można niejawnie przekonwertować typu string[] na System.Collections.Generic.List<Ranking.Wyniki>

            List<Wyniki> wyniki = new List<Wyniki>();
            wyniki = File.ReadAllLines("TeamsUEFA.txt");
            foreach(var line in wyniki)
            {
                Console.WriteLine(line);
            }

 

komentarz 22 marca 2021 przez areklipno Stary wyjadacz (11,930 p.)

Nie możesz nazwać "wyniki" jednocześnie listy klasy Wyniki i tablicy -> linijek tekstu z pliku,

musiałoby to wyglądać w stylu:

List<Wyniki> wyniki = new List<Wyniki>();
var lines = File.ReadAllLines("TeamsUEFA.txt");
foreach(var line in lines)
{
    Wyniki wynik = new Wyniki();
    wyniki.Druzyna = "czesc linii z pliku"
    if(decimal.TryParse("czesc linii z wynikiem", out decimal wartosc) )
{
wyniki.Wynik = wartosc;
}
wyniki.Add(wynik);
}

 

komentarz 22 marca 2021 przez piter11251 Obywatel (1,280 p.)
Nie rozumiem zbytnio co dokładnie miałbym wpisać w miejsce "czesc linii z pliku" i "czesc linii z wynikiem". Jakby, druzyny mogą miec nazwy kilkuczłonowe i kiedy program miałby przestawać zapisywać do stringa i zaczynać zapisywać do decimala
komentarz 22 marca 2021 przez areklipno Stary wyjadacz (11,930 p.)

nie wiem jakie masz dane wsadowe....

np jeśli plik zawierałby wpisy:

Lech;10

Legia;15

to kod wyglądałby odpowiednio:

wyniki.Druzyna = line.Split(";")[0]

oraz

if(decimal.TryParse(line.Split(";")[1], out decimal wartosc) )

 

Kwestia jak są ułożone dane w pliku - w zależności od tego trzeba odpowiednio podstawić pod wartości, które podałem jako teksty w cudzysłowie.

komentarz 22 marca 2021 przez piter11251 Obywatel (1,280 p.)
Juz Ci mowie:
przyklady:
Liverpool 40

Manchester United 50

FC Barcelona 99
komentarz 23 marca 2021 przez areklipno Stary wyjadacz (11,930 p.)
to widzę wtedy 2 opcje....

1. sprawdzanie każdej litery w ciągu znaków ->dopóki znak nie jest cyfrą -> jest to drużyna, od cyfry do końca ciągu jest to liczba

2 wyrażenia regularne -> zrobienie wyrażenia na liczbę i wrzucenie jako wynik punktowy, a resztę jako zespół
komentarz 23 marca 2021 przez VBService Ekspert (252,660 p.)
edycja 23 marca 2021 przez VBService

Punkt 1 można od tyłu do pierwszej spacji, albo zrobić split-a po "spacji" - ostatni to punkty.  wink

Podobne pytania

0 głosów
1 odpowiedź 282 wizyt
0 głosów
2 odpowiedzi 102 wizyt
pytanie zadane 11 lipca 2017 w C i C++ przez Szymon195 Nowicjusz (120 p.)
0 głosów
1 odpowiedź 168 wizyt
pytanie zadane 1 listopada 2018 w C i C++ przez eee Nowicjusz (120 p.)

92,546 zapytań

141,387 odpowiedzi

319,503 komentarzy

61,930 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...