2016-03-16 31 views
7

我有一個會議列表,其中有另一個與會者列表。LINQ「Where」條件 - >更改財產價值

與此類似型號 -

public class Meeting 
    { 
     public string Id { get; set; } 
     public string Title { get; set; } 
     public List<User> Users { get; set; } 
     public DateTime StartTime { get; set; } 
     public DateTime EndTime { get; set; } 
    } 

我有會議

的列表

List<Meeting> meetings = GetMeetings();

現在我想掩蓋其中的一個用戶是[email protected]會議的Title。我可以在多個LINQ查詢中實現這一點,但我正在尋找優化的LINQ查詢..

任何人都可以幫助我嗎?

我想什麼 -

var maskedMeetings = meetings.Where(x = x.Users.Any(a => a.Email.Equals("[email protected]"))); 

meetings = appointments.Except(maskedMeetings).ToList(); 

maskedMeetings = maskedMeetings.Select(x => { x.Title = "Bot"; return x; }).ToList(); 

meetings = meetings.Concat(maskedMeetings).ToList(); 

誰能幫我寫這個查詢的優化的方式?

拉胡爾。

+1

之間顯著不同對於你有什麼不滿意的是什麼? – CodingGorilla

+3

定義「優化」。在我看來,將四個清晰,簡明的工作代碼行更改爲一條長鏈並不是「優化的」。 –

+0

嗯,我同意@DStanley我不太瞭解LINQ的性能優化,因此我問了這個問題:-) –

回答

9

如果我正確地讀取了您的代碼,您正在查詢您的項目的子集,從原始列表中刪除這些項目,修改子集中的項目,並將修改的項目放回列表中。沒有必要經歷所有這些;只需修改列表中的項目即可。

Linq,但是,查詢,而不是更新。要在集合中更新對象,而只需使用一個循環:

foreach(var meeting in meetings) 
{ 
    if(meeting.Users.Any(a => a.Email.Equals("[email protected]"))) 
     meeting.Title = "Bot"; 
} 

或使用LINQ預過濾列表

foreach(var meeting in meetings.Where(x = x.Users.Any(a => a.Email.Equals("[email protected]"))) 
{ 
    meeting.Title = "Bot"; 
} 

注意,性能可能不會是兩個

+0

謝謝@DStanley。如果可能的話,請告訴我哪一個更好,爲什麼(即使它沒有顯着不同)。只是爲了知識:-) –

+0

第一種方法會因爲Linq的開銷而在性能上有一個非常輕微的優勢。但是放棄第二種選擇還遠遠不夠。當你閱讀它時,使用最適合你的一個。 –

+0

謝謝@DStanley :-)它幫了我很多 –