sortowanie listboxa

0

Witam
Mam listboxa o zawartości.
Przykładowa zawartość:
1.0.0.0.nazwa1.2.3.4
2.3.4.1.nazwa4.1.3.3
1.4.0.3.nazwa3.1.4.4
2.4.3.6.nazwa2.1.1.1
5.13.3.1.nazwa5.1.1.1

Mój problem polega na posortowaniu go alfabetycznie względem zawartości zaznaczonej na zielono.
budowa każdej linijki to:
wartość1.wartość2.wartość3.wartość4.wartość do posortowania.wartość6.wartość7.wartość.8
Wartości poodzielane są kropkami.

Czy istnieje jakiś prosty sposób rozwiązania tego problemu?
Z góry dziękuję za pomoc.

1

Jeśli chodzi ci o jakiejś instrukcji typu Array.QuickSortByFirstLetterIgnoreNumbers to nie słyszałem, ale nie zaszkodzi poszukać (msdn, google) Sposobów jest pewnie wiele. Najprosciej chyba wczytać wszystkie do tablicy, pousuwać elementy przed pierwszą literą (można to szybko zrobić co najmniej na 3 sposoby), i posortować same nazwy, a później wczytać elementy w takiej kolejności jak w tablicy. Wadą takiego rozwiązanie jest zdecydowanie pamięcio i obliczeniożerność. Znacznie wydajniej będzie za pomocą wyrażeń regularnych, ale nie czuję się na siłach żeby to dokładnie wytłumaczyć :]

0

najlatwiej bedzie uzyc wyrazen regularnych, gdzie wzorzec bedzie przyjmowal tylko wyrazy[a-z][A-Z]
innym sposobem jest uzyc linq i tylko z tym bedzie troszke wiecej zachodu bo bedzie trzeba dzielic stringi, ale mozna to stosunkowo krotko zapisac... dam ci tylko przyklad (bo nie bede za Ciebie robil) ktory powinien Cie jakos tam naprowadzic ;]:


string twojplik = @"~/twojplik.txt";
//tworzymy sobie liste ktora bedzie np pobierala nazwy z pliku:
List<string> lista = new List<string>();
StreamReader sr = new StreamReader(twojplik);
            string line;
            while ((line = sr.ReadLine()) != null)
            {
                
                lista.Add(line);
            }


            var query = from posot in lista
                        select posot;

//sortujemy liste, w tym przypadku bierzemy to co znajduje sie za '.' zostanie posortowane alfabetycznie 
            var posortowane = query.OrderBy(c =>c.Substring(c.IndexOf('.')));

            sr.Close();

            using (StreamWriter sw = new StreamWriter(twojplik))
            {
//no i zapisujemy posortowane wyniki do tego samego pliku
                foreach (string g in posortowane)
                {
                    sw.WriteLine(g);
                }
                Console.WriteLine("segregowanie ukonczono");
                
            }
1

Regex na tak wielu iteracjach może nie być najbardziej optymalnym rozwiązaniem. Chyba lepiej pomęczyć się z operacjami na stringach jak IndexOf(), SubString() itd niż regex. Kod będzie gorszy, ale wydajność lepsza.
.. no chyba że performance jest Ci tu obojętny.

1

Uzycie raz skompilowanego wyrażenia wcale nie musi być niewydajne. Wystarczy stworzyć instancję klasy Regex zamiast korzystać ze statycznych metod:

Regex r = new Regex("...pattern", RegexOptions.Compiled);

Oczywiscie najlepiej napisać oba rozwiązania i zmierzyć ich wydajnosc - o ile ona w ogole ma jakiekolwiek znaczenie. W tym przypadku watpie czy ma - nie wiem ile elementow trzeba by bylo wpychac do listboxa zeby zauwazyc jakikolwiek wzrost wydajnosci. Pewnie wtedy totalna nieprzydatnosc tak skonstruowanego listboxa bylaby wiekszym problemem.

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