我正在撰寫幾行代碼來讀取 XML 檔案,獲取元素集合,將它們添加到串列中,然后檢查重復項。應該很簡單,但我無法讓它作業。
這是我閱讀的 XML(或為簡單起見的摘錄)。注意第一個和第三個條目是相同的,這些是我想要識別的:
<pmEntry>
<dmRef>
<dmRefIdent>
<dmCode modelCode="CRAFT123" systemCode="B" anotherCode="63" infoCode="010" />
<issueInfo issueNumber="001" inWork="00" />
</dmRefIdent>
<dmRefAddressItems>
<dmTitle>
<techName>My data</techName>
<infoName>General data</infoName>
</dmTitle>
</dmRefAddressItems>
</dmRef>
<dmRef>
<dmRefIdent>
<dmCode modelCode="CRAFT789" systemCode="B" anotherCode="50" infoCode="500" />
<issueInfo issueNumber="001" inWork="00" />
</dmRefIdent>
<dmRefAddressItems>
<dmTitle>
<techName>Some other data</techName>
<infoName>Technical data</infoName>
</dmTitle>
</dmRefAddressItems>
</dmRef>
<dmRef>
<dmRefIdent>
<dmCode modelCode="CRAFT123" systemCode="B" anotherCode="63" infoCode="010" />
<issueInfo issueNumber="001" inWork="00" />
</dmRefIdent>
<dmRefAddressItems>
<dmTitle>
<techName>My data</techName>
<infoName>General data</infoName>
</dmTitle>
</dmRefAddressItems>
</dmRef>
</pmEntry>
這是將 XML 檔案的檔案路徑傳遞到其中的方法。
private void CheckPMforDuplicates(string path)
{
XDocument doc = XDocument.Load(path);
List<XElement> DMList = new List<XElement>();
var DMs = doc.Descendants("dmRefIdent");
if (DMs != null)
{
foreach (var dm in DMs)
{
DMList.Add(dm);
}
var duplicates = DMList
.GroupBy(i => i.Element("dmCode"))
.Where(g => g.Elements("dmCode").Count() > 1)
.Select(g => g.Key);
if (duplicates != null)
{
string duplicateDMstring = "";
foreach (var dup in duplicates)
{
duplicateDMstring = duplicateDMstring ",\r\n " dup;
}
if(duplicateDMstring == "")
{
MessageBox.Show("No duplicates");
}
else
{
MessageBox.Show("Duplicates are " duplicateDMstring);
}
}
}
}
如果我更改 Linq 查詢以查找等于 1 的計數(即“== 1”),它會按預期在訊息框中為我提供一個很好的元素串列。但由于某種原因,它不會找到重復項。
這顯然是一個 Linq 問題,但我無法讓它顯示兩個重復的條目。
uj5u.com熱心網友回復:
這不是 LINQ 問題,而是平等問題。您 group by Element("dmCode"),這是一個XElement- 參考型別,因此默認情況下GroupBy將比較參考。要實際比較元素的內容,請使用i.Element("dmCode").Valueori.Element("dmCode").ToString()代替:
var duplicates = DMList
.GroupBy(i => i.Element("dmCode").ToString())
.Where(g => g.Elements("dmCode").Count() > 1)
.Select(g => g.Key);
或提供您自己的IEqualityComparer.
另請參閱:如何在 XElement 屬性上使用 LINQ Group by
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/489254.html
