Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 23
  1. #1

    [C#] Ordinamento stringhe

    Ciao a tutti!
    Oggi ho un'altro problema per voi
    Sto provando a creare una piccola applicazione in c# in cui è presente una textbox in cui inserire la stringa e 2 radiobutton in cui si può selezionare se:

    1) se è selezionato il RadioButton Pari si mettono prima i caratteri di posizione pari e poi quelli di posizione dispari
    2) se è selezionato Dispari si mettono prima i caratteri di posizione dispari e poi i pari.

    Es. Se il messaggio è "abcdefg" il programma deve restituire "acegbdf".
    L'algoritmo può essere una cosa del genere?

    codice:
    string messaggio = Convert.ToString(textBox1.Text);
    string definitivo2;
    string[] definitivo = messaggio.Split();
    
    if (radioButton1.Checked == true)
                {
                    for (int i = 1; i < definitivo.Length; i++)
                    {
                        char a;
                        
                        if (i % 2 == 0)
                        {
                            a = Convert.ToChar(definitivo[i - 1]);
                            definitivo[i - 1] = definitivo[i];
                            definitivo[i] = Convert.ToString(a);
                        }
                    }
                    
                    for (int i = 0; i < definitivo.Length; i++)
                    {
                        definitivo2 = definitivo2 + definitivo[i];
                    }
                    textBox2.Text = definitivo2;
    
                }
    Il problema è che mi restituisce la stringa iniziale e non me la converte.
    A qualcuno viene un'idea?

  2. #2
    E' forse lo split che da problemi? E' perchè l'ho richiamato con solo
    string[] definitivo = messaggio.Split();
    e non gli ho dato un separatore da seguire? E allora come faccio ad avere una array contenente tutti i caratteri di una stringa?

  3. #3
    Ho fatto una cosa del genere:
    codice:
                string[] definitivo = new string[messaggio.Length];
                for (int i = 0; i < messaggio.Length; i++)
                {
                    definitivo[i] = Convert.ToString(messaggio[i]);
                }
    e ora l'output dando "abcdefg" è "acbedgf".

  4. #4
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,539
    Ciao,
    buttato giù al volo... non so se è quello che volevi e non so se sia il modo migliore, ma è il primo che mi è venuto :

    codice:
    string mess = "abcdefg";
    bool dispari= true;
    int i = 0;
    string orderString = string.Join(string.Empty, mess.ToArray().GroupBy(p => (i++ % 2) == 0).OrderBy(o=>dispari?o.First():o.Last()).SelectMany(p => p));
    edit : ho messo dispari al posto di pari (corretto )

  5. #5
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    ciao

    Secondo me dovresti usare array di char al posto delle stringhe.


    char[] definitivo = new char[200];
    definitivo = textBox1.Text.ToCharArray();


    occhio che quando vuoi chiudere un array di char , devi inserire il terminatore

    definitivo[100]='\0'; //fine array char
    Tecnologia

  6. #6
    Un'idea buttata giù al volo...

    codice:
            private string Ordina(string In)
            {
                StringBuilder Out = new StringBuilder(In.Length);
                for (int i = 0; i < 2; i++)
                {
                    for (int j = i; j < In.Length; j += 2)
                    {
                        Out.Append(In[j]);
                    }
                }
                return (Out.ToString());
            }

  7. #7
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,539
    Originariamente inviato da ESSE-EFFE
    Un'idea buttata giù al volo...

    codice:
            private string Ordina(string In)
            {
                StringBuilder Out = new StringBuilder(In.Length);
                for (int i = 0; i < 2; i++)
                {
                    for (int j = i; j < In.Length; j += 2)
                    {
                        Out.Append(In[j]);
                    }
                }
                return (Out.ToString());
            }
    Ciao
    stavo ragionando un pò sulla tua soluzione, ottima , ma per invertire l'ordine?

  8. #8
    Originariamente inviato da U235
    Ciao
    stavo ragionando un pò sulla tua soluzione, ottima
    Non è ottimizzata, ma mi sembrava il sistema più semplice.

    Originariamente inviato da U235
    , ma per invertire l'ordine?
    Basta "allungare" un po' una delle righe (di codice). Ho già testato anche la versione completa, ma non volevo togliere all'OP il gusto di completarla da sè. Casomai, se non emerge, più avanti la posto.

  9. #9
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,539
    Originariamente inviato da ESSE-EFFE
    Non è ottimizzata, ma mi sembrava il sistema più semplice.


    Basta "allungare" un po' una delle righe (di codice). Ho già testato anche la versione completa, ma non volevo togliere all'OP il gusto di completarla da sè. Casomai, se non emerge, più avanti la posto.
    se ti va postamela in privato, ma magari se la condividi con tutti è meglio.


  10. #10
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,539
    Comunque io una soluzione per il tuo algoritmo l'ho pure trovata, ma ovviamente preferisco vedere la tua, più che altro perchè vorrei vedere la differenza a livello di pulizia di codice.
    mi spiego meglio :
    con questa soluzione
    codice:
    string mess = "abcdefg";
    bool dispari= true;
    int i = 0;
    string order = string.Concat(mess.GroupBy(p => (i++ % 2) == 0)
          .OrderBy(o => dispari ? o.First() : o.Last())
          .SelectMany(p => p));
    il codice è un pò meno e un pò più pulito (poi anche questo è opinabile...), ma a livello di prestazioni perde (e questo è un dato di fatto), se lo guardiamo in percentuale la differenza di prestazioni è tantissima, ma a livello numerico si tratta di 10 ms circa contro i 4 ms circa del tuo (senza algoritmo di inversione, ma non cambierebbe comunque di molto), e questo cambia di pochissimo anche aggiungendo una stringa molto lunga (file di testo abbastanza grosso), quindi comunque si tratta di pochi ms...

    a questo punto io mi sono domandato : ma visto che la differenza di pulizia e poca così come la differenza di prestazioni, perchè nella maggior parte delle aziende in cui ho lavorato (alcune anche "grosse") pretendono linq e se fai qualche ciclo storcono il naso dicendo che è poco leggibile? e magari poi ti dicono pure che devi spremere più velocità possibile

    secondo voi forumisti, un cicletto ogni tanto non ci sta pure bene ? (vedi questo caso...)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.