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: 178

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: 8302
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: 178

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: 908

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
Grzegorz123



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

PostWysłany: Wto Sty 22, 2019 2:52 pm  OP    Temat postu: Odpowiedz z cytatem Pisownia

Dzięki Sinus32, poczytałem w google o tym trochę ale to chyba jeszcze nie mój poziom. Jestem jeszcze dość "cienki" i często nie rozumiem podstawowych zagadnień, uczę się ciągle. Opcja wydaje się interesująca spróbuję to jakoś zrozumieć i może uda się zaimplementować.

Świadomość możliwości i tego co się potrafi zrobić bywa mocno frustrująca :-)
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
Sinus32



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

PostWysłany: Wto Sty 22, 2019 5:07 pm      Temat postu: Odpowiedz z cytatem Pisownia

Podrzuć nieco kodu w xaml`u to może uda się coś wykminić. Na pewno przyda się fragment odpowiedzialny za rysowanie elementów podpiętych pod kolekcję.
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.16886 sekund, zapytan = 12
contact

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