2012-08-03 42 views
6

Tôi đang sử dụng LINQ để chọn đối tượng twoWords mới thành List đối tượng này và đặt giá trị bằng cách gọi hàm/phương pháp.LINQ chọn đối tượng mới, thiết lập giá trị của đối tượng trong hàm

Hãy xem điều này có hợp lý không, tôi đã đơn giản hóa nó rất nhiều. Tôi thực sự muốn sử dụng các câu lệnh linq fromselect.

Chức năng đầu tiên trong GOGO sẽ làm việc, điều thứ hai thất bại (họ không thực hiện nhiệm vụ tương tự mặc dù)

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

Chức năng thứ hai của GOGO sẽ gây ra một lỗi:

Các loại biểu thức trong mệnh đề chọn không chính xác. Không thể nhập suy luận trong cuộc gọi đến 'Chọn'.

Câu hỏi của tôi là, làm thế nào để chọn đối tượng mới twoWords trong from khoản trên, trong khi thiết lập các giá trị bằng cách sử dụng chức năng setvalues?

+4

Là một sang một bên, nó * thực sự * giúp dễ đọc nếu bạn tuân theo quy ước đặt tên .NET ngay cả đối với mã mẫu đơn giản . –

Trả lời

18

Bạn cần sử dụng lệnh lambda, có nghĩa là không sử dụng biểu thức truy vấn. Trong trường hợp này tôi sẽ không sử dụng một biểu thức truy vấn dù sao, cho rằng bạn đã chỉ có một lựa chọn ...

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

Hoặc cách khác, chỉ cần có một phương pháp mà trả về một thích hợp twoWords:

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

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

này cũng sẽ cho phép bạn sử dụng một biểu thức truy vấn nếu bạn thực sự muốn:

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

Tất nhiên tùy chọn khác sẽ được cung cấp cho twoWords một constructor whic h đã làm điều đúng để bắt đầu, tại thời điểm đó bạn sẽ không cần phải gọi một phương thức ...

+0

Cảm ơn Jon. Điều này chắc chắn sẽ làm việc cho câu hỏi của tôi. Vì lợi ích, nếu tôi muốn sử dụng một biểu thức truy vấn, VÀ giữ cho lớp haiWords là như thế nào? Điều này có thể không? Lựa chọn thực tế của tôi trông giống như sau: Danh sách twoWords = (từ menu trong xmlDoc.Descendants ("MENU") trong đó (chuỗi) menu. Thuộc tính ("type") == menuType từ các từ trong menu.Elements ("item") chọn new haiWords(). setAttributes (từ) ) .ToList(); –

+1

@DavidSmit: Bạn có thể làm điều đó, nhưng chỉ với một phương pháp trợ giúp (theo phần dưới cùng). Biểu thức truy vấn * chỉ * cho phép biểu thức lambdas. –

+0

Cảm ơn Jon vì đã giúp đỡ! –

Các vấn đề liên quan