2012-04-30 21 views
5

Tôi đang tìm hiểu thêm một chút về LINQ và sử dụng nó nhiều hơn một chút, do đó, một chút công việc phát triển tự đi đây ...Object với LINQ

tôi có một đối tượng như sau:

public class Player(){ 

    public string Name{get;set;} 

    public Club currentClub{get;set;} 

    public IEnumerable<Club> previousClubs{get;set;} 

} 

Bây giờ, với danh sách người chơi, tôi muốn chọn những người đã từng chơi cho các câu lạc bộ được chọn khác nhau, tôi có thể làm điều đó dễ dàng bằng một vài câu lệnh foreach - nhưng tôi muốn làm điều đó với Linq ...

Tôi đã thử điều này, nhưng không có gì được trả về từ nó:

var prevClubs = 
    from player in players 
    from clubOriginal in player.previousClubs 
    from clubSecond in player.previousClubs 
    from clubThird in player.previousClubs 
    where clubOriginal.ID == 1 
    where clubSecond.ID == 2 
    where clubThird.ID == 3 
    select new HistoryOfPlayer{ 
     firstClub == clubOriginal.Name, 
     secondClub == clubSecond.Name, 
     thirdClub == clubThird.Name 
    } 

Bất kỳ trợ giúp nào ở nơi tôi gặp sự cố? Các dữ liệu chắc chắn tồn tại bởi vì khi tôi có vòng lặp foreach vòng qua các câu lạc bộ bên trong một vòng lặp qua các cầu thủ và tôi trở lại một bộ sưu tập của tất cả các cầu thủ đã chơi cho các câu lạc bộ 1,2 & 3 có dữ liệu ...

Hiệu quả nó sẽ trả về một số trường hợp của đối tượng HistoryOfPlayer, tất cả đều chứa tên của 3 câu lạc bộ giống nhau (như chúng được liên kết trên ID) - như tôi đã nói, một chút tự học, vì vậy hãy thử áp dụng nó vào thể thao nó dính vào đầu tôi một chút !!

Ai đó có thể giúp bạn không?

+0

Bạn nên liên kết với 'Tham gia' không phải là' Where' trong LINQ-To-Objects vì lý do hiệu suất: http://stackoverflow.com/questions/5551264/why-is-linq-join-so-much-faster -an-linking-with-where –

Trả lời

4

bạn có thể làm cho nó năng động hơn

List<int> clubIds = new List<int> { 1, 2, 3}; 
var prevClubs = from player in players 
       where player.previousClubs.Any(m => clubIds.Contains(m.ID)) 
       select new HistoryOfPlayer { 
        Player = player, 
        Clubs = player.previousClubs 
           .Where(m => clubIds.Contains(m.ID)) 
           .Select(c => c.Name) 
       }; 

chỉnh sửa sau khi bài phát biểu của ông svik:

List<int> clubIds = new List<int> { 1, 2, 3}; 
var prevClubs = from player in players 
       where clubIds.All(id => player.previousClubs 
               .select(club => club.ID) 
               .contains(id)) 
       select new HistoryOfPlayer { 
        Player = player, 
        Clubs = player.previousClubs 
           .Where(m => clubIds.Contains(m.ID)) 
           .Select(c => c.Name) 
       }; 

* Lưu ý này được viết mà không có một IDE, vì vậy tôi đã không kiểm tra nếu nó hoạt động.

+0

Tôi không nghĩ rằng truy vấn này thực hiện những gì đang được yêu cầu. Truy vấn ban đầu yêu cầu người chơi trong 1, 2 ** và ** 3. Vì vậy, một cái gì đó giống như 'where clubIds.All (c => player.PreviousClubs.Contains (c))'. – svick

+0

@svick Vâng, như tôi đã nói, tôi không có bất kỳ máy tính nào gần đó mà tôi có thể kiểm tra nhưng bạn có thể đúng cách – Frederiek

+0

@svick Nhưng sau đó phải là cách khác xung quanh. Một cầu thủ có thể đã được đến câu lạc bộ nhiều hơn tôi nghĩ. – Frederiek

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