Grupowanie LINQ

0

Witam, chciałbym wypisać wszystkie elementy z grupy automatycznie, np foreach. Borykam się z problemem gdyż muszę każdąIteracje.NazweKategorii wypisywać ręcznie. Problem zaczął by się gdyby było dużo kategorii i ręczne wpisywanie brzmi nieciekawie.

class Zwierzak
    {
        public string nazwa;
        public char płeć; // K or M
        public int wiek;
        public Zwierzak()
        } 

//MAIN

 List<Zwierzak> koko = new List<Zwierzak>()
            {
                new Zwierzak("Tygrys", 'K', 36),
                new Zwierzak("Piesss", 'M', 89),
                new Zwierzak("Kangur", 'K', 33),
                new Zwierzak("Kuraaa", 'M', 65),
                new Zwierzak("Lemurr", 'M', 22),
                new Zwierzak("Kaczka", 'M', 22),
                new Zwierzak("Kaczka", 'K', 89),
                new Zwierzak("Kangur", 'K', 33),
            };
var query = from w in koko group w by w.płeć ;
foreach (var item in query)
            {
                Console.WriteLine("Kategoria: "+item.Key);
                foreach ( var e in item)
                {
                    Console.WriteLine("   "+e.nazwa+ " " + e.wiek /*+ " " + e.płeć */);
                }
            }

Widziałem tutoriale gdzie w drugim foreache wystarczało console.WriteLine(e) i wypisywało całość, jednak u mnie zwraca class.Zwierzak. Czy jest jakis sposób by wypisywało mi wszystkie wartosci (nazwa, płeć, wiek) ale różne od klucza grupującego (płci) czyli wypisywało pod płcią wieku oraz nazwy?

płeć_K
nazwa1 lat1
nazwa2 lat2
...
płeć_M
nazwa3 lat3
nazwa4 lat4
...

Pozdrawiam serdecznie

1

w klasie zwierzak przeciaz funkcje ToString() na to co chcesz by ci wyspisywalo i wtedy w Twoim przykladzie bedziesz mogl uzyc po prostu obiektu e

0
public override string ToString()
        {
            return this.nazwa +" "+ wiek + " "+ płeć ;
        }

wypisałem w foreach { e.toString() ); i działa ładnie jednak wyisuje mi:

Kategoria K
słoń lat17 K
małpa lat20 K
krowa lat30 K

Kategoria M (męska płeć)
kurczak lat94 M
jeż lat93 M
...

Dziękuję za temat przeciążania toString() męczę się tez z tym w innym wątku na forum : ))

Pisanie ponownie 'M' na koncu brzmi bezsensownie, w koncu jest to kategorią już (rodzaj płci K/M).
Dało by się w LINQ jakoś to w dwóch linijkach wyeliminować tą powielaną informację?
.Any()? .All()?
Ponownie z góry dziękuję

0
wonman napisał(a):

Pisanie ponownie 'M' na koncu brzmi bezsensownie, w koncu jest to kategorią już (rodzaj płci K/M).
Dało by się w LINQ jakoś to w dwóch linijkach wyeliminować tą powielaną informację?
.Any()? .All()?

Zamiast kombinować, to może po prostu nie wyświetlać tego w ToString?

0

Wypisuje tak jak chciałeś. Ja bym to zrobił tak:

    class Zwierzak
    {
       
            public string nazwa { get; set; }
            public char płeć { get; set; } // K or M
            public int wiek { get; set; }
           
        
    }
class Program
    {
        static void Main(string[] args)
        {

            var koko = new List<Zwierzak>()
            {
                new Zwierzak() {nazwa = "Tygrys", płeć = 'K', wiek = 36},
                new Zwierzak() {nazwa = "Piesss", płeć = 'M', wiek = 89},
                new Zwierzak() {nazwa = "Kangur", płeć = 'K', wiek = 30},
                new Zwierzak() {nazwa = "Kuraaa", płeć = 'M', wiek = 32},
                new Zwierzak() {nazwa = "Słoń", płeć = 'K', wiek = 33},

            };
            var query = from w in koko group w by w.płeć;

//kosmetyka dla LINQ 
            var query2 = koko.GroupBy(w => w.płeć);
            
            foreach (var item in query2)
            {  
                //formatowanie w c#6.0
                Console.WriteLine($"Płeć:{item.Key} ");

                foreach (var e in item)
                {
                    Console.WriteLine($" {e.nazwa} {e.wiek} lat");
                }
            }

            Console.ReadLine();
        }
    }

1 użytkowników online, w tym zalogowanych: 0, gości: 1