2012-08-03 20 views
6

estoy usando LINQ para seleccionar un nuevo objeto en un twoWordsList de estos objetos, y establecer los valores llamando a una función/método.LINQ seleccionar al nuevo objeto, el establecimiento de los valores de objeto en función de

Por favor, vea si esto tiene sentido, lo he simplificado mucho. Realmente quiero usar las sentencias linq fromselect.

La primera función en GOGO va a funcionar, la segunda falla (no realizan la misma tarea, aunque)

// 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 segunda función de GOGO causará un error:

El tipo de la expresión en la cláusula de selección es incorrecta. La inferencia de tipo falló en la llamada a 'Seleccionar'.

Mi pregunta es, ¿cómo puedo seleccionar el nuevo objeto en el twoWordsfrom cláusula anterior, mientras que el establecimiento de los valores utilizando la función setvalues?

+4

Como nota aparte, * realmente * ayuda a la legibilidad si sigue las convenciones de nomenclatura de .NET incluso para código de ejemplo simple . –

Respuesta

18

Necesita usar una declaración lambda, lo que significa que no debe usar una expresión de consulta. En este caso yo no usaría una expresión de consulta de todos modos, dado que usted ha conseguido solamente un selecto ...

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

O, alternativamente, sólo hay un método que devuelve una adecuada twoWords:

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

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

Esto también permitirá utilizar una expresión de consulta si realmente quería:

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

Por supuesto, otra opción sería dar un constructor twoWords whic H hizo lo correcto para empezar, en ese punto no solo necesitaría llamar a un método ...

+0

Gracias Jon. Esto definitivamente funcionará para mi pregunta. Por cuestiones de interés, ¿qué ocurre si quiero utilizar una expresión de consulta Y mantener la clase twowords como está? es posible? Mis miradas reales selectos como este: Lista twoWords = (desde el menú en xmlDoc.Descendants ("MENU"), donde (cadena) menu.Attribute ("tipo") == menuType de las palabras en menu.Elements ("elemento") seleccione nuevas dos palabras(). setAttributes (words) ) .ToList(); –

+1

@DavidSmit: puede hacerlo, pero solo con un método de ayuda (según la parte inferior). Expresiones de consulta * solo * permiten la expresión lambdas. –

+0

¡Gracias Jon por la ayuda! –

Cuestiones relacionadas