You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中将无重复人员数据写入XML文件?

避免生成重复人员条目(XML生成优化)

现有XML结构

你当前生成的XML结构如下:

<Osoby> 
  <Osoba> 
    <Id>1</Id> 
    <Imie>Jan</Imie> 
    <Nazwisko>Kowalski</Nazwisko> 
    <Wiek>23</Wiek> 
  </Osoba> 
  ...
  <Osoba> 
    <Id>500</Id> 
    <Imie>Marek</Imie> 
    <Nazwisko>Nowak</Nazwisko> 
    <Wiek>37</Wiek> 
  </Osoba> 
</Osoby>

现有C#生成代码

你用来生成500条随机人员数据的代码如下:

private void button1_Click(object sender, EventArgs e) 
{ 
    button2.Visible = true; 
    string[] Imie = { "Mariusz", "Mikołaj", "Przemek", "Krzysiek", "Patryk", "Janusz", "Lechu" }; 
    string[] Nazwisko = { "Kujawski", "Kowal", "Nowak", "Kowalski", "Dul", "Paleta", "Kawka" }; 
    Random losuj = new Random(); 
    XmlTextWriter writer = new XmlTextWriter("osoby.xml", System.Text.Encoding.UTF8); 
    writer.WriteStartDocument(true); 
    writer.Formatting = Formatting.Indented; 
    writer.Indentation = 2; 
    writer.WriteStartElement("Osoby"); 
    for (int i = 0; i < 500; i++) 
        createNode(i.ToString(), Imie[losuj.Next(0, 7)], Nazwisko[losuj.Next(0, 7)], losuj.Next(1, 50).ToString(), writer); 
    writer.WriteEndElement(); 
    writer.WriteEndDocument(); 
    writer.Close(); 
    MessageBox.Show("Utworzono plik XML ! "); 
} 

private void createNode(string pID, string pName, string pSurname, string pAge, XmlTextWriter writer) 
{ 
    writer.WriteStartElement("Osoba"); 
    writer.WriteStartElement("Id"); 
    writer.WriteString(pID); 
    writer.WriteEndElement(); 
    writer.WriteStartElement("Imie"); 
    writer.WriteString(pName); 
    writer.WriteEndElement(); 
    writer.WriteStartElement("Nazwisko"); 
    writer.WriteString(pSurname); 
    writer.WriteEndElement(); 
    writer.WriteStartElement("Wiek"); 
    writer.WriteString(pAge); 
    writer.WriteEndElement(); 
    writer.WriteEndElement(); 
}

需求说明

你希望避免生成Imie、Nazwisko、Wiek完全相同的重复条目(ID本身由循环保证唯一,无需考虑),比如避免出现两条完全一样的Przemek Nowak 22记录。


解决方案思路

核心是跟踪已生成的人员组合,每次生成新的<Imie, Nazwisko, Wiek>组合前,先检查这个组合是否已经存在。我们可以用HashSet<(string Imie, string Nazwisko, string Wiek)>来存储已生成的组合——ValueTuple可以直接作为HashSet的元素,而且查找效率很高(O(1)时间复杂度)。

修改后的完整代码

private void button1_Click(object sender, EventArgs e) 
{ 
    button2.Visible = true; 
    string[] Imie = { "Mariusz", "Mikołaj", "Przemek", "Krzysiek", "Patryk", "Janusz", "Lechu" }; 
    string[] Nazwisko = { "Kujawski", "Kowal", "Nowak", "Kowalski", "Dul", "Paleta", "Kawka" }; 
    Random losuj = new Random(); 
    // 用HashSet存储已生成的人员组合,避免重复
    HashSet<(string Imie, string Nazwisko, string Wiek)> existingPeople = new HashSet<(string, string, string)>();
    
    XmlTextWriter writer = new XmlTextWriter("osoby.xml", System.Text.Encoding.UTF8); 
    writer.WriteStartDocument(true); 
    writer.Formatting = Formatting.Indented; 
    writer.Indentation = 2; 
    writer.WriteStartElement("Osoby"); 

    int generatedCount = 0;
    // 循环直到生成500个不重复的条目
    while (generatedCount < 500)
    {
        string currentImie = Imie[losuj.Next(0, Imie.Length)];
        string currentNazwisko = Nazwisko[losuj.Next(0, Nazwisko.Length)];
        string currentWiek = losuj.Next(1, 50).ToString();
        
        var personTuple = (currentImie, currentNazwisko, currentWiek);
        // 检查组合是否未存在
        if (!existingPeople.Contains(personTuple))
        {
            existingPeople.Add(personTuple);
            createNode(generatedCount.ToString(), currentImie, currentNazwisko, currentWiek, writer);
            generatedCount++;
        }
    }

    writer.WriteEndElement(); 
    writer.WriteEndDocument(); 
    writer.Close(); 
    MessageBox.Show("Utworzono plik XML ! "); 
} 

private void createNode(string pID, string pName, string pSurname, string pAge, XmlTextWriter writer) 
{ 
    writer.WriteStartElement("Osoba"); 
    writer.WriteStartElement("Id"); 
    writer.WriteString(pID); 
    writer.WriteEndElement(); 
    writer.WriteStartElement("Imie"); 
    writer.WriteString(pName); 
    writer.WriteEndElement(); 
    writer.WriteStartElement("Nazwisko"); 
    writer.WriteString(pSurname); 
    writer.WriteEndElement(); 
    writer.WriteStartElement("Wiek"); 
    writer.WriteString(pAge); 
    writer.WriteEndElement(); 
    writer.WriteEndElement(); 
}

关键修改点说明

  1. 新增HashSet<(string Imie, string Nazwisko, string Wiek)>来记录已生成的人员组合,确保每个组合唯一。
  2. 将原来的for循环改为while循环,直到生成满500个不重复的条目才停止(因为原来的for循环可能生成重复项,导致实际有效条目不足500)。
  3. 每次生成随机值后,先检查组合是否在HashSet中,只有不存在时才写入XML并添加到HashSet中。

这样就能保证最终生成的XML里,除了ID不同外,不会出现Imie、Nazwisko、Wiek完全相同的重复人员条目了。

内容的提问来源于stack exchange,提问作者Yamakasi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:28:35