2012-08-03 14 views
6

Używam LINQ, aby wybrać nowy obiekt twoWords do obiektu List tego obiektu i ustawić wartości przez wywołanie funkcji/metody.LINQ wybierz do nowego obiektu, ustawiając wartości obiektu w funkcji

Proszę sprawdzić, czy to ma sens, bardzo to uprośniłem. Naprawdę chcę użyć instrukcji linq fromselect.

Pierwsza funkcja w GOGO będzie działać, drugi nie powiedzie się (nie wykonują to samo zadanie, chociaż)

// 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(); 
    } 
} 

Drugą funkcją GOGO spowoduje błąd:

typ wyrażenia w klauzuli select jest niepoprawny. Wnioskowanie typu nie powiodło się w wywołaniu opcji "Wybierz".

Moje pytanie brzmi, jak mam wybrać nową twoWords obiekt w powyższym from klauzuli, podczas ustawiania wartości za pomocą funkcji setvalues?

+4

Odkładając to na bok, * naprawdę * ułatwia czytelność, jeśli będziesz przestrzegał konwencji nazewnictwa .NET nawet dla prostego kodu przykładowego . –

Odpowiedz

18

Musisz użyć instrukcji lambda, co oznacza, że ​​nie używasz wyrażenia zapytania. W tym przypadku nie byłoby użycie wyrażenia kwerendy w każdym razie, biorąc pod uwagę, że już tylko dostał wybierz ...

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

lub alternatywnie, tylko mieć metodę, która zwraca odpowiedni twoWords:

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

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

To także pozwala użyć wyrażenia kwerendy jeśli naprawdę chciał:

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

oczywiście innym rozwiązaniem byłoby dać twoWords konstruktora whic h zrobił właściwą rzecz na początek, w którym to momencie nie musiałbyś tylko wywoływać metody ...

+0

Dzięki Jon. To z pewnością zadziała na moje pytanie. Dla dobra interesu, co jeśli chciałbym użyć wyrażenia zapytania, I zachować klasę dwóch słów jak jest? czy to możliwe? Moi rzeczywiste wybierz wygląda następująco: Lista twoWords = (z menu w xmlDoc.Descendants ("MENU") gdzie (string) menu.Attribute ("typ") == typu menu od słów (w menu.Elements "item") wybierz nowy twoWords(). setAttributes (słowa) ) .ToList(); –

+1

@DavidSmit: Możesz to zrobić, ale tylko przy pomocy metody pomocnika (jak w dolnej części). Wyrażenia wyrażeń * tylko * pozwalają na wyrażenie lambdas. –

+0

Dzięki Jon za pomoc! –

Powiązane problemy