如何在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(); }
关键修改点说明
- 新增
HashSet<(string Imie, string Nazwisko, string Wiek)>来记录已生成的人员组合,确保每个组合唯一。 - 将原来的
for循环改为while循环,直到生成满500个不重复的条目才停止(因为原来的for循环可能生成重复项,导致实际有效条目不足500)。 - 每次生成随机值后,先检查组合是否在HashSet中,只有不存在时才写入XML并添加到HashSet中。
这样就能保证最终生成的XML里,除了ID不同外,不会出现Imie、Nazwisko、Wiek完全相同的重复人员条目了。
内容的提问来源于stack exchange,提问作者Yamakasi
相关产品推荐
相关产品推荐

