2012-08-03 10 views
6

Sto utilizzando LINQ per selezionare un nuovo oggetto twoWords in un List di questi oggetti e impostare i valori chiamando una funzione/metodo.LINQ selezionare il nuovo oggetto, impostare i valori dell'oggetto nella funzione

Si prega di vedere se questo ha senso, l'ho semplificato molto. Voglio davvero usare le istruzioni linq fromselect.

La prima funzione in GOGO funziona, il secondo fallisce (non svolgono lo stesso compito però)

// simple class containing two strings, and a function to set the values 
public class twoWords 
{ 
    public string word1 { get; set; } 
    public string word2 { get; set; } 

    public void setvalues(string words) 
    { 
     word1 = words.Substring(0,4); 
     word2 = words.Substring(5,4); 
    } 
} 

public class GOGO 
{ 

    public void ofCourseThisWillWorks() 
    { 
     //this is just to show that the setvalues function is working 
     twoWords twoWords = new twoWords(); 
     twoWords.setvalues("word1 word2"); 
     //tada. object twoWords is populated 
    } 

    public void thisdoesntwork() 
    { 
     //set up the test data to work with 
     List<string> stringlist = new List<string>(); 
     stringlist.Add("word1 word2"); 
     stringlist.Add("word3 word4"); 
     //end setting up 

     //we want a list of class twoWords, contain two strings : 
     //word1 and word2. but i do not know how to call the setvalues function. 
     List<twoWords> twoWords = (from words in stringlist 
          select new twoWords().setvalues(words)).ToList(); 
    } 
} 

La seconda funzione di GOGO causerà un errore:

L' il tipo dell'espressione nella clausola select non è corretto. Digitare un'inferenza non riuscita nella chiamata a 'Seleziona'.

La mia domanda è, come faccio a selezionare il nuovo oggetto nella twoWords sopra from clausola, mentre l'impostazione dei valori utilizzando la funzione setvalues?

+4

Per inciso, * davvero * aiuta la leggibilità se si seguono le convenzioni di denominazione .NET anche per un semplice codice di esempio . –

risposta

18

È necessario utilizzare una dichiarazione lambda, che significa non utilizzare un'espressione di query. In questo caso non vorrei usare un'espressione di query in ogni caso, dato che hai solo una select ...

List<twoWords> twoWords = stringlist.Select(words => { 
               var ret = new twoWords(); 
               ret.setvalues(words); 
               return ret; 
              }) 
            .ToList(); 

Oppure, in alternativa, basta avere un metodo che restituisce un adeguato twoWords:

private static twoWords CreateTwoWords(string words) 
{ 
    var ret = new twoWords(); 
    ret.setvalues(words); 
    return ret; 
} 

List<twoWords> twoWords = stringlist.Select(CreateTwoWords) 
            .ToList(); 

Ciò permetterà anche di utilizzare un'espressione di query se si voleva davvero:

List<twoWords> twoWords = (from words in stringlist 
          select CreateTwoWords(words)).ToList(); 

Naturalmente un'altra opzione sarebbe quella di dare twoWords un costruttore whic Ho fatto la cosa giusta per iniziare, a quel punto non avresti solo bisogno di chiamare un metodo ...

+0

Grazie Jon. Questo funzionerà sicuramente per la mia domanda. Per interesse, cosa succede se volevo usare un'espressione di query, e mantenere la classe di due parole così com'è? È possibile? miei effettivi sguardi selezionare come questo: Elenco twoWords = (dal menu nel xmlDoc.Descendants ("MENU") dove (string) menu.Attribute ("tipo") == menuType dalle parole in menu.Elements ("articolo") selezionare nuove due parole(). setAttributes (words) ) .ToList(); –

+1

@DavidSmit: puoi farlo, ma solo con un metodo di supporto (come nella parte inferiore). Le espressioni di query * solo * consentono espressioni lambda. –

+0

Grazie Jon per l'aiuto! –

Problemi correlati