2016-03-16 12 views
7

Ho un elenco di riunioni all'interno del quale ho un altro elenco di partecipanti.LINQ Condizione "Dove" -> modifica del valore della proprietà

modello simile a questo -

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; } 
    } 

ho elenco di Meeting

List<Meeting> meetings = GetMeetings();

Ora voglio mascherare il Title degli incontri in cui uno degli utenti è [email protected]. Posso ottenere questo risultato in più query LINQ ma sto cercando query LINQ ottimizzata.

Qualcuno può aiutarmi con questo?

Quello che ho cercato -

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

qualcuno mi può aiutare con il modo ottimizzato di scrivere questa ricerca?

Rahul.

+1

Qual è il sub-ottimale di ciò che hai? – CodingGorilla

+3

Definire "ottimizzato". La modifica di quattro linee chiare e concise di codice funzionante su una lunga catena non è "ottimizzata" secondo me. –

+0

Beh, sono d'accordo, @DStanley Non ho abbastanza familiarità con le ottimizzazioni delle prestazioni per LINQ quindi ho posto la domanda :-) –

risposta

9

Se leggo correttamente il codice, si sta eseguendo una ricerca per un sottoinsieme di elementi, rimuovendo tali elementi dall'elenco originale, modificando gli elementi nel sottoinsieme e reinserendo gli elementi modificati nell'elenco. Non c'è bisogno di passare attraverso tutto questo; basta modificare gli articoli all'interno della lista.

Linq, tuttavia, è per query, non aggiornamento. Per aggiornare gli oggetti in una collezione basta usare un ciclo:

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

o utilizzare LINQ to pre-filtrare l'elenco

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

Si noti che le prestazioni saranno probabilmente non sarà significativamente differente tra i due

+0

Grazie @DStanley. Se possibile, puoi dirmi quale potrebbe funzionare meglio e perché (anche se non è significativamente diverso). Solo per motivi di conoscenza :-) –

+0

Il primo metodo avrebbe _probabilmente_ un margine di prestazioni molto basso, solo a causa del sovraccarico di Linq. Ma non è quasi sufficiente rinunciare alla seconda opzione. Usa quello che ritieni più sensato quando lo leggi. –

+0

Grazie @DStanley :-) Mi ha aiutato molto –

Problemi correlati