2011-09-09 92 views
2

我試圖獲得一個類似值的列表中的唯一值區分只有一個管道分隔字符串中的一個元素...我一直得到至少一個對象必須實現Icomparable。我不明白爲什麼我一直這樣做。我能夠按照這個價值分組......爲什麼我找不到最大值...我想它正在尋找某種東西來與它進行比較。如果我得到整數版本,它會停止對我大喊大叫?這是我最後一次嘗試使用LINQ ...至少有一個對象必須實現Icomparable

var queryResults = PatientList.GroupBy(x => x.Value.Split('|')[1]).Select(x => x.Max()); 

我知道我可以通過其他方式獲得唯一值。我只是很難找出答案。在那份清單中,我知道在我的同類兄弟中價值最高的字符串是我想要添加到列表中的字符串。我怎樣才能做到這一點?我完全一片空白,因爲我一直在試圖讓這個在LINQ的,沒有運氣的最後幾天工作...

foreach (XmlNode node in nodeList) 
      { 
       XmlDocument xDoc = new XmlDocument(); 
       xDoc.LoadXml(node.OuterXml); 
       string popPatInfo = xDoc.SelectSingleNode("./template/elements/element[@name=\"FirstName\"]").Attributes["value"].Value + ", " + xDoc.SelectSingleNode("./template/elements/element[@name=\"LastName\"]").Attributes["value"].Value + " | " + DateTime.Parse(xDoc.SelectSingleNode("./template/elements/element[@name=\"DateOfBirth\"]").Attributes["value"].Value.Split('T')[0]).ToString("dd-MMM-yyyy"); 
       string patientInfo = xDoc.SelectSingleNode("./template/elements/element[@name=\"PatientId\"]").Attributes["value"].Value + "|" + xDoc.SelectSingleNode("./template/elements/element[@name=\"PopulationPatientID\"]").Attributes["enc"].Value;// +"|" + xDoc.SelectSingleNode("./template/elements/element[@name=\"AdminDate\"]").Attributes["value"].Value; 
       int enc = Int32.Parse(patientInfo.Split('|')[1]); 
       if (enc > temp) 
       { 
        lastEncounter.Add(enc, patientInfo); 
        temp = enc; 
       } 
       //lastEncounter.Add(Int32.Parse(patientInfo.Split('|')[1])); 

       PatientList.Add(new SelectListItem { Text = popPatInfo, Value = patientInfo }); 
      } 

我想使用某種形式的臨時變量來找出是最高的值,然後將該字符串添加到列表中。我完全是一個空白,但是...

回答

3

在這裏我得到了一個匿名類型的ID以使其可讀。

var patientEncounters= from patient in PatientList 
         let PatientID=Int32.Parse(patient.Value.Split('|')[0]) 
         let EncounterID=Int32.Parse(patient.Value.Split('|')[1]) 
         select new { PatientID, EncounterID }; 

然後我們按用戶名和獲得最後遭遇

var lastEncounterForEachUser=from pe in patientEncounters 
          group pe by pe.PatientID into grouped 
          select new 
            { 
             PatientID=grouped.Key, 
             LastEncounterID=grouped.Max(g=>g.EncounterID) 
            }; 
+0

在該選擇列表項目右側,該值具有Patient ID,並遇到ID。最高的遭遇ID將是最後一次遭遇。初始列表中可能有幾個項目都是同一個患者(相同的患者ID ......但也可能有幾個不同的患者編號)。但是SelectListItem的每個值都有一個遇到的ID。最高的是最近的遭遇。我希望每個患者ID的最後一次接觸,我希望列表中的那些......我想通過患者ID右邊第一組,然後選擇遇到ID的最大值。 – SoftwareSavant

+0

這是正確的嗎? patient.Value.Split('|')[0]是PatientID patient.Value.Split('|')[1]是EncounterID –

+0

這是正確的。 – SoftwareSavant

3

Linq不知道如何比較2 Patient對象,所以它不能確定哪一個是「最大」的。您需要使Patient類實現IComparable<Patient>,以定義如何比較Patient對象。

// Compare objets by Id value 
public int CompareTo(Patient other) 
{ 
    return this.Id.CompareTo(other.Id); 
} 

另一種選擇是使用可用的MaxBy擴展方法喬恩斯基特的MoreLinq項目:

var queryResults = PatientList.GroupBy(x => x.Value.Split('|')[1]) 
           .Select(x => x.MaxBy(p => p.Id)); 

編輯:我認爲有一個Patient類,但再次閱讀你的代碼,我意識到這不是案子。 PatientList實際上是SelectListItem的集合,因此您需要在該類中實施IComparable

+0

我不明白爲什麼我不能只是鑽下來的Int32.Parse(Value.Split(「|」 )[1])並且讓它比較。 – SoftwareSavant

+1

@DmainEvent,我不知道我是否明白你真正想做什麼......在'Select'調用中,x是一個'IGrouping ',所以它的項目類型爲'SelectListItem'。你可以通過'Int32.Parse'(Value.Split('|')[1])來找到最大值,但是它並不合理,因爲同一組中的所有項目都具有相同的值 –

+0

患者是隻需選擇一個List項目。值字符串中的值最高。我把它分開。我已經看到這個DLL,並且我真的很厭煩將其他人的DLL放在我的生產代碼中。我認爲這是非常糟糕的形式。 – SoftwareSavant

相關問題