2016-03-16 4 views
7

Ich habe eine Liste von Sitzungen, in denen ich eine andere Liste von Teilnehmern habe.LINQ "Where" Bedingung -> Wert der Eigenschaft ändern

Modell ähnlich wie diese -

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

Ich habe Liste der Meeting

List<Meeting> meetings = GetMeetings();

Jetzt möchte ich die Title der Sitzungen maskieren, wo einer der Benutzer [email protected] ist. Ich kann dies in mehreren LINQ-Abfragen erreichen, aber ich bin auf der Suche nach einer optimierten LINQ-Abfrage.

Kann mir jemand dabei helfen?

Was ich versuchte -

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

Kann mir jemand mit optimiertem Art und Weise helfen, diese Abfrage zu schreiben?

Rahul.

+1

signifikant unterschiedlich sein Was ist suboptimal über das, was Sie haben? – CodingGorilla

+3

Definieren Sie "optimiert". Vier klare, prägnante Zeilen des Arbeitscodes zu einer langen Kette zu ändern, ist meiner Meinung nach nicht "optimiert". –

+0

Nun, ich stimme zu, @DStanley Ich bin nicht vertraut mit Leistungsoptimierungen für LINQ Daher habe ich die Frage gestellt :-) –

Antwort

9

Wenn ich Ihren Code richtig gelesen habe, suchen Sie nach einer Teilmenge Ihrer Artikel, entfernen diese Artikel aus der ursprünglichen Liste, ändern die Artikel in der Teilmenge und fügen die geänderten Artikel wieder in die Liste ein. Es ist nicht nötig, all das durchzugehen. Ändern Sie einfach die Elemente in der Liste.

Linq ist jedoch für Abfrage, nicht Aktualisierung. Um Objekte in einer Sammlung zu aktualisieren verwenden nur eine Schleife:

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

oder Linq verwenden, um Vorfilter die Liste

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

Beachten Sie, dass die Leistung nicht wahrscheinlich zwischen den beiden

+0

Danke @DStanley. Wenn möglich kannst du mir bitte sagen welches besser und warum besser wäre (auch wenn es sich nicht signifikant unterscheidet). Nur um des Wissens willen :-) –

+0

Die erste Methode würde wahrscheinlich eine _sehr, sehr leichte_ Kante in der Leistung haben, nur wegen des Overhead von Linq. Aber es ist nicht annähernd genug, um auf die zweite Option zu verzichten. Verwenden Sie das, was Ihnen am sinnvollsten erscheint, wenn Sie es lesen. –

+0

Dank @DStanley :-) Es hat mir sehr geholfen –