2016-03-16 37 views
7

İçinde başka bir katılımcı listesine sahip olduğum bir toplantılar listesi var. Buna benzerLINQ "Nerede" koşulu -> taşınmazın değerini değiştirin

Modeli -

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

Ben Şimdi kullanıcılarından biri [email protected] olan toplantıların Title maskelemek istediğiniz

List<Meeting> meetings = GetMeetings();

Toplantısı

listesi var. Birden çok LINQ sorgusunda bunu başarabilirim ama en uygun LINQ sorgularını arıyorum ..

Bu konuda bana yardımcı olan var mı?

Denedim Ne -

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

kimse bu sorguyu yazma iyileştirilmiş yolu ile bana yardımcı olabilir? Rahul,

Rahul.

+1

arasında önemli ölçüde farklı olmayacaktır listesine

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

Not-filtreyi öncesi Linq kullanmak Sahip olduğunuzla ilgili olarak optimal olan nedir? – CodingGorilla

+3

"Optimize edilmiş" öğesini tanımlayın. Dört açık, özlü çalışma kodu satırının bir uzun zincire dönüştürülmesi, benim fikrimce "optimize edilmiş" değildir. –

+0

Peki, katılıyorum @DStanley LINQ için performans optimizasyonları konusunda oldukça aşina değilim, bu yüzden soruyu sordum :-) –

cevap

9

Kodunuzu doğru okursam, öğelerinizin bir alt kümesini sorgulamanız, bu öğeleri orijinal listesinden çıkarmanız, alt kümedeki öğeleri değiştirmeniz ve değiştirilen öğeleri listeye geri koymanız gerekir. Bunların hepsinden geçmeye gerek yok; Listedeki öğeleri değiştir. değil , sorgulama güncellenmesi için

Linq Ancak olduğunu. Bir koleksiyondaki nesneleri güncellemek için sadece bir döngü kullanın:

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

veya performans olasılıkla iki

+0

Teşekkürler @DStanley. Eğer mümkünse, hangisinin daha iyi performans göstereceğini ve (neden olmasa bile; farklı olmasa bile) hangisini söylerseniz. Sadece bilginin uğruna :-) –

+0

İlk yöntem, sadece Linq'in yükü nedeniyle performans açısından _probably_ _very, çok hafif bir kenara sahip olacaktır. Ancak, ikinci seçeneği öne çıkarmak neredeyse yeterli değil. Okuduğunda hangisinin size en uygun olanı kullanın. –

+0

Teşekkürler @DStanley :-) Bu bana çok –