Mano a mano che prendo confidenza mi rendo sempre più conto della potenza dello strumento LINQ nella sua declinazione LINQ To Objects. Ecco un esempio pratico da tenere in considerazione:

   1: string text = (from ListItem item in chkLines.Items
   2:                where item.Selected == true
   3:                select item.Text)
   4:                .DefaultIfEmpty()
   5:                .Aggregate((a, b) => a = a + (!string.IsNullOrEmpty(a) ? ", " : "") + b);

Questo esempio in due parole fa:

  1. prende tutte le checkbox selezionate da una CheckBoxlist (where...)
  2. ne estrae il testo (select item.Text)
  3. lo concatena separando gli elementi con una virgola solo quando serve (Aggregate)
  4. gestisce il caso in cui la sequenze sia vuota (DefaultIfEmpty)

L'esempio è banale forse, ma la domanda è: quante righe di codice occorrevano prima per un risultato del genere?

Technorati Tag: ,,

Commenti (7) -

# | Corrado Cavalli | 26.02.2008 - 06.46

Andrea,
La mia paura nei confronti di LINQ è che si abbia un proliferare di soluzioni "one line" che tutto hanno tranne che essere "leggibili".
Personalmente tra (uso una checkedlistbox winform)

#1
string text1=null;
foreach (string item in checkedListBox1.CheckedItems)
{
text1 += "," + item.ToString();
}

#2
string text2 = checkedListBox1.CheckedItems.OfType<string>().DefaultIfEmpty().Aggregate((a,b)=> a = a+","+b);

Al momento preferisco la prima.
Ovviamente ci sono scenari in cui il paragone non regge e la sintassi LINQ è decisamente più esplicativa e in questo caso, come te, ne appoggio al 100% l'uso.

# | Andrea Boschin | 26.02.2008 - 06.54

Personalmente non sono spaventato da questo tipo di uso di LINQ perchè in effetti se le query sono scritte con un certo criterio sono anche leggibili. Piuttosto quello che ritengo sempre difficile stimare è l'efficienza di un metodo piuttosto che di un altro. Ma credo che sia solo questione di esperienza...

# | Massimo Andreetta | 26.02.2008 - 21.58

Anche io non sono molto amante del codice in line.
Devo ammettere però che a prima vista, la potenza dello strumento merita di sbatterci la testa.

# | Andrea Corelli | 28.02.2008 - 00.09

Scusate, è la prima volta che posto e vorrei chiedervi una opinione in merito al metodo Aggregate di linq:

per replicare questo codice

string txt = "";
foreach (string item in checkedListBox1.CheckedItems)
txt += " - " + item + "\n";

con linq sono costretto a fare per forza una (brutta) cosa così

string txt2 = " - " + checkedListBox1.CheckedItems.OfType<string>().Aggregate((a, b) => a = a + "\n - " + b );

Oppure non sto ragionando quadrimensionalmente (citando "ritorno al futuro")?

# | Andrea Boschin | 28.02.2008 - 00.12

se ti riferisci all'uso del += puoi stare tranquillo. è possibilissimo.

# | Andrea Corelli | 28.02.2008 - 00.51

Non proprio, intendevo dire che all'interno di un foreach posso manipolare qualsiasi item (compreso il primo) come voglio; non mi sembra che Aggregate mi permetta di ottenere lo stesso risultato (aggiungere un "-" ad ogni item trovato nella lista, compreso il primo).

# | Andrea Boschin | 28.02.2008 - 05.19

non è chiaro quale sia il tuo scopo, ma a naso direi che non è una cosa fattibile, ma probabilmente nemmeno auspicabile. se devi modificare qualcosa non fai una query, fai un foreach. Smile

Aggiungi Commento