Forum Coders' city Strona Główna Coders' city
Nasza pasja to programowanie!
 

 PomocPomoc   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy  RejestracjaRejestracja 
Archiwum starego forum + teoria    RSS & Panel/SideBar
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Potrzebuję szybkiej odpowiedzi na moje pytanie... Zasady

[WPF C#] Sortowanie elementów kolekcji



 
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Visual Studio: C#, VB, VC++, …
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Grzegorz123



Dołączył: 27 Cze 2017
Posty: 171

PostWysłany: Nie Sty 20, 2019 8:58 pm  OP    Temat postu: [WPF C#] Sortowanie elementów kolekcji Odpowiedz z cytatem Pisownia

Mam kolekcję LabelSet składającą się z wielu elementów typu
- EL_Line
- EL_Rectangle
- EL_TextBox
- EL_Graphics
chciałbym je posortować wg typu w kolejności Descending.

Do kolekcji użytkownik dodaje elementy w przypadkowej kolejności, nie wiem jak są indeksowane elementy, zapewne od 0 ... n. W efekcie sortowania najważniejsze jest, żeby elementy EL_Graphics były zawsze na końcu.

Czy da się to jakoś w miarę prosto zrobić ?
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
samolot



Dołączył: 26 Sty 2006
Posty: 8299
Skąd: Toruń

PostWysłany: Nie Sty 20, 2019 11:04 pm      Temat postu: Odpowiedz z cytatem Pisownia

Elementy w kolekcji są "ułożone", że tak powiem, w kolejności takiej, jaka wynika ze zdarzeń w programie, czyli ani malejąco, ani rosnąco względem alfabetu czy względem liczb.
jeśli niektóre elementy są usuwane z kolekcji, to pamięć po nich jest "zagospodarowana" przez kompilator dla innych elementów w sposób znany tylko jemu i zapewne autorom kompilatora. Mnie swego czasu też to było potrzebne i, prawdę mówiąc, nie udało się tego zgłębić przy pomocy bardziej zaawansowanych użytkowników tego forum. Z doświadczenia mogę powiedzieć, że elementy dodane do niej najpóźniej będą na samym końcu.
Ponadto elementy kolekcji nie mają indeksów. Nie można z niej pobrać, na przykład, elementu o indeksie 4. Ale można z niej pobrać wszystkie elementy z pomocą pętli For Each do, na przykład, Listy, ArayListy czy do Tablicy. Tak więc wg mnie, samo trzymanie elementów w kolekcji jest pożyteczne w kodzie programu, ale na potrzeby użytkownika trzeba je pobrać z kolekcji do na przykład tablicy, bo wtedy możemy je posortować rosnąco, czy malejąco i użytkownikowi pokazać posortowane.

A jeśli ty chcesz by elementy o nazwach "EL_Graphics" były zawsze na końcu, to proponuję do nazw dodać prefiks na przykład z dwóch podkreślników, następnie posortować w trybie Ascending. Wtedy wszystkie z podkreślnikami znajdą się na początku tablicy. Następnie przepisać do nowej tablicy najpierw tylko elementy bez tego prefiksu, a następnie te z podkreślnikami pozbawić prefiksu, posortować w trybie Ascending i w takiej postaci dopisać do tej nowe tablicy. W tym momencie trzeba pamiętać o tym, żeby ta tablica miała zdezaktywowane automatyczne sortowanie, bo taka właściwość mogłaby zniweczyć cały wysiłek nietypowego sortowania. No i w takiej postaci można tę listę nazw wyświetlić użytkownikowi.
Tak bym ja to zrobił.
Tylko pamiętaj, że użytkownikowi pokazujesz tylko nazwy etykiet z kolekcji, a nie same etykiety. Więc po wybraniu przez użytkownika konkretnej nazwy etykiety, program powinien zaplanowaną operacje wykonać na etykiecie w kolekcji, która ma tę nazwę. Ale to jest chyba zrozumiałe.

_________________
Nie zadawaj bezcelowych pytań / Windows 8.1 / Windows 10 / VB2008 / VB 2010 / VB 2012 / Pisz poprawnie
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email
Grzegorz123



Dołączył: 27 Cze 2017
Posty: 171

PostWysłany: Pon Sty 21, 2019 10:22 am  OP    Temat postu: Odpowiedz z cytatem Pisownia

No właśnie chciałem uniknąć takiego rozwiązania - ale jeśli się nie da, to trudno.
Rozważałem też zrobienie kopii kolekcji, usunięcie elementów z oryginalnej i dodawaniu elementów z kopii w odpowiedniej kolejności bo to by uprościło wiele innych aspektów, których nie poruszyłem w poście.
For each element in kopia
   if ! element is EL_Graphics
      dodać

For each element in kopia
   if element is EL_Graphics
      dodać

Jakoś tak, może niezbyt optymalnie ale przy kilku, kilkunastu elementach kolekcji bez znaczenia.

Cóż będę dalej próbował, dziękuję za wyjaśnienia i pomoc.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
Sinus32



Dołączył: 20 Sty 2007
Posty: 906

PostWysłany: Pon Sty 21, 2019 9:04 pm      Temat postu: Odpowiedz z cytatem Pisownia

W WPF możesz wykorzystać CollectionViewSource jako pośrednika pomiędzy kolekcją danych a widokiem. W CollectionViewSource można zdefiniować sortowanie według którego mają pojawiać się elementy.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Odwiedź stronę autora
Wyświetl posty z ostatnich:   
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Visual Studio: C#, VB, VC++, … Wszystkie czasy w strefie CET (Europa)

Strona 1 z 1

 
Skocz do:  
Możesz pisać nowe tematy
Możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Możesz dodawać załączniki na tym forum
Możesz pobierać pliki z tego forum




Debug: strone wygenerowano w 0.12183 sekund, zapytan = 12
contact

| Darmowe programy i porady Jelcyna | Tansze zakupy w Helionie | MS Office Blog |