Lista - wyświetlanie jednego elementu z dwóch

0

Witam,

Mam metodę składającą się na dwa argumenty. Pierwszy argument to string (imię mężczyzny), drugi również string (imię kobiety).
Metoda ta służy do dodawania tych elementów do listy.
Mam np. takie elementy:
Fryderyk Anna
Fryderyk Wioleta
Fryderyk Maria

Chcę, aby wyświetlanie było w sposób następujący:
Fryderyk: Anna, Wioleta, Maria

Chodzi mi o to, żeby mężczyznę pobierało raz, a po dwukropku wypisywało argumenty pasujące do pierwszego (Fryderyka).

Proszę o nakierowanie mnie na rozwiązanie.
Pozdrawiam.

0

Musisz przeszukać listę i po każdym natrafieniu na element z ustalonym imieniem mężczyzny wyświetlić imię kobiety; Nie musisz tych kobiecych imion gdzieś zapisywać, wystarczy, że wyświetlisz imię mężczyzny, a po znalezieniu elementu z tym imieniem wyświetlasz imie kobiety; Po zakończeniu szukania przechodzisz do nowej linii i gotowe;

No i jakoś mało kodu podałeś, więc nic więcej nie można doradzić.

0

Jak na razie mam takiego foreach'a

Console.WriteLine("\nLista preferencji mężczyzn:\n");
foreach (MalePreferList mPair in maleprefers)
{
    ++i;
    toFile("Para " + i + ": " + mPair.male.returnMaleName() + ", " + mPair.female.returnFemaleName());
    Console.WriteLine("Para " + i + ": " + mPair.male.returnMaleName() + ", " + mPair.female.returnFemaleName());
}

Na słowo "Para" proszę nie patrzeć.
toFile to funkcja zapisująca do pliku, więc ją też omijamy.

Metoda dodająca kobiety do listy preferencji mężczyzny:

public void addMalePreferList(String maleName, String femaleName)
{
       Male male = findMale(maleName);
       Female female = findFemale(femaleName);
       MalePreferList mPair = new MalePreferList(male, female);
       maleprefers.Add(mPair);
}
0

Dictionary<string,string> ewentualnie Dictionary<string, List<string>>

0

zastosuj grupowanie:

        var pary = new List<string> {
            "Fryderyk Anna",
            "Fryderyk Wioleta",
            "Fryderyk Maria"
        };

        var wynik = (from para in pary
         let split = para.Split(' ')
         let mezczyzna = split[0]
         let kobieta = split[1]
         group kobieta by mezczyzna into kobiety
         select new { Mezczyzna = kobiety.Key, Kobiety = kobiety.ToList() });

        foreach(var para in wynik)
        {
            Console.WriteLine(string.Format("{0}: {1}", para.Mezczyzna, string.Join(", ", para.Kobiety)));
        }
0

albo w sumie jeszcze łatwiej w tym przypadku - możesz zastosować Lookup:

            var pary = new List<string> {
                "Fryderyk Anna",
                "Fryderyk Wioleta",
                "Fryderyk Maria",
                "Adam Anna",
                "Adam Krystyna",
                "Eryk Edyta"
            };

            var lookup = pary.ToLookup(p => p.Split(' ')[0], p => p.Split(' ')[1]);

            foreach (var para in lookup)
            {
                Console.WriteLine(string.Format("{0}: {1}", para.Key, string.Join(", ", para)));
            }
0

Dziękuję za odpowiedzi. Jeszcze nie testowałem z żadnego z rozwiązań, ale gdy już się za to zabiorę to na pewno dam znać.

Co do "var pary" nie mogę tak zrobić. Zrobiłeś tutaj na sztywno, a te pary pobierane są z pliku.
Pary przechowuje lista:

private List<MalePreferList> maleprefers = new List<MalePreferList>();

dodanie znacznika <code class="csharp"> - fp

1

Zastosowałem inne rozwiązanie, a mianowicie:

List<string> maleNames = new List<string>();
foreach (MalePreferList m in maleprefers.Distinct())
{
       maleNames.Add(m.male.returnMaleName());
}
foreach (string name in maleNames.Distinct())
{
       Console.Write(name + ": ");
       foreach (MalePreferList mPair in maleprefers.FindAll(x => x.male.returnMaleName() == name))
       {
            Console.Write(mPair.female.returnFemaleName() + " ");
       }
       Console.WriteLine();
}

Co prawda nie jest to ekonomiczne rozwiązanie bo spowalnia cały kod, ale dla mojej struktury to rozwiązanie musi zostać użyte.
Problem polega na tym, że powinienem był potworzyć więcej list (dla każdej pary).

To rozwiązanie daje wynik:

Fryderyk: Anna Wioleta Maria

itd.

0

używając Lookup ten sam kod wyglądałby tak:

foreach (var pairs in maleprefers.ToLookup(p => p.male.returnMaleName(), p => p => p.female.returnFemaleName()))
{
	Console.Write(pairs.Key + ": ");
	Console.WriteLine(string.Join(" ", pairs));
}
0
foreach (var pairs in maleprefers.ToLookup(p => p.male.returnMaleName(), p => p.female.returnFemaleName()))
{
	Console.Write(pairs.Key + ": ");
	Console.WriteLine(string.Join(" ", pairs));
}

poprawione

1
razielnr1 napisał(a):

Co do "var pary" nie mogę tak zrobić. Zrobiłeś tutaj na sztywno, a te pary pobierane są z pliku.

zrobiłem tak dla przykładu, liczyłem na inteligencję autora tematu ;)

0

@gfdsgsdfgsd,
Działa i Twoje rozwiązanie, super. Mniej linijek kodu, więc użyję Twojego :)
Dzięki!

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