簡體   English   中英

使用linq過濾列表列表

[英]Using linq to filter List of List

我仍然對LINQ不太了解,覺得我的代碼可以優化,因此需要幫助。

我有一個“患者”和“中級班”,每個班級都有一個公開的IsSelected。 這些被包裝在PatientMeds和PatientMeds類中。

public class PatientMeds
{
    public Patient Patient;
    public List<Med> Meds;
}

public class PatientsMeds
{
    public List<PatientMeds> PatientMedsList;
}

我想過濾這些,所以如果Patient.IsSelected == false,則忽略它,而僅忽略IsSelected == false的Meds;

現在,此代碼有效:

List<PatientMeds> patientMedsList = PatientsMeds.PatientMedsList
    .Where(x => x.Patient.IsSelected)
    .ToList();
foreach (PatientMeds patientMeds in patientMedsList)
{
    var medsToRemove = patientMeds.Meds.Where(m => m.IsSelected == false).ToList();
    foreach (Med med in medsToRemove)
    {
        patientMeds.Meds.Remove(med);
    }
}

但這似乎“笨拙”。 我怎樣才能使它更好?

我將使用ForEach RemoveAll方法

List<PatientMeds> patientMedsList = PatientsMeds.PatientMedsList
    .Where(x => x.Patient.IsSelected)
    .ToList();
patientMedsList.ForEach(p=> p.Meds.RemoveAll(m=>!m.IsSelected));

您可以使用僅包含選定患者和PatientMedsPatientMeds實例構建新列表:

var selectedPatientsWithSelectedMeds = patientMedsList.Where(p => p.IsSelected)
                                      .Select(p => new PatientMeds
                                      {
                                        Patient = p.Patient,
                                        Meds = p.Meds.Where(m => m.IsSelected).ToList()
                                      })
                                      .ToList();

因此, Where(p => p.IsSelected)僅選擇選定的患者,而Select(p => new PatientMeds { ... }構造新的PatientMeds實例。

最后, p.Meds.Where(m => m.IsSelected).ToList()構造一個僅包含所選葯物的新列表。

但是尚不清楚構造新的PatientMedsList<Med>實例是否可行。 例如,在new PatientMeds { ... }您將需要映射PatientMeds所有屬性。

您可以嘗試RemoveAll

patientsMeds
    .PatientMedsList
    .Where(m => m.Patient.IsSelected)
    .ToList()
    .ForEach(m => m.Meds.RemoveAll(med => !med.IsSelected));

作為引用類型,盡管您使用ToList()方法創建了新列表,但它將指向相同的位置。 因此,結果也將反映在patientsMeds

嘗試縮短以下foreach循環

foreach (PatientMeds patientMeds in patientMedsList)
{
    patientMeds.Meds.RemoveAll(m => m.IsSelected == false);   
}

只需使用:

var bb = patientMedsList.Where(p => p.Patient.IsSelected).ToList().Select(p => new PatientMeds { Patient = p.Patient, Meds = p.Meds.Where(m => m.IsSelected).ToList() }).ToList();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM