C# 如何将数据保存到xml文件而不复制数据
我的xml文件如下所示:C# 如何将数据保存到xml文件而不复制数据,c#,xml,C#,Xml,我的xml文件如下所示: <Osoby> <Osoba> <Id>1</Id> <Imie>Jan</Imie> <Nazwisko>Kowalski</Nazwisko> <Wiek>23</Wiek> </Osoba> . . . <Osoba> <Id&
<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>
1.
简
科瓦尔斯基
23
.
.
.
500
马雷克
诺瓦克
37
以及我写入xml文件的过程,该文件随机生成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();
}
private void按钮1\u单击(对象发送者,事件参数e)
{
按钮2.可见=真实;
字符串[]Imie={“Mariusz”、“Mikołaj”、“Przemek”、“Krzysiek”、“Patryk”、“Janusz”、“Lechu”};
字符串[]Nazwisko={“Kujawski”、“Kowal”、“Nowak”、“Kowalski”、“Dul”、“Paleta”、“Kawka”};
Random losuj=新的Random();
XmlTextWriter=newXMLTextWriter(“osoby.xml”,System.Text.Encoding.UTF8);
writer.WriteStartDocument(true);
writer.Formatting=格式化.缩进;
writer.Indentation=2;
writer.WriteStarteElement(“Osoby”);
对于(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.writeedelement();
writer.WriteEndDocument();
writer.Close();
Show(“utworzonoplikxml!”);
}
私有void createNode(字符串pID、字符串pName、字符串pSurname、字符串页、XmlTextWriter)
{
作者:书面声明(“Osoba”);
writer.writeStarElement(“Id”);
writer.WriteString(pID);
writer.writeedelement();
作者。书面声明(“Imie”);
writer.WriteString(pName);
writer.writeedelement();
作者:书面声明(“纳兹维斯科”);
writer.WriteString(pSurname);
writer.writeedelement();
作者。书面声明(“Wiek”);
writer.WriteString(第页);
writer.writeedelement();
writer.writeedelement();
}
如何将数据保存到xml文件中,而无需复制人员
例如:我不想有这样的人:
- Przemek Nowak 22岁
- Przemek Nowak 22岁
不管参数“id”是什么,由于代码中的循环,它是唯一的。好的,所以一步一步的解决方案是创建一个包含name和lastname的类Person。然后在一个循环中,首先随机生成name和lastname,并检查列表中是否已经存在这样的组合,因此已经写入XML文件。若并没有,那个么将该组合添加到列表中并调用您的write方法。通过这种方式,您将跟踪已经写入XML的随机组合,因为您的列表包含一个副本。Person类只是一个容器,可以帮助您更轻松地检查fistname和lastname组合的重复项
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
class Person
{
public string Name { get; set; }
public string Lastname { get; set; }
}
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();
}
private void button1_Click_1(object sender, EventArgs e)
{
string[] Imie = { "Anna", "Piotr", "Katarzyna ", "Andrzej", "Małgorzata", "Jan", "Agnieszka ", "Stanisław", "Barbara", "Tomasz", "Marcin", "Marek", "Magdalena", "Łukasz" };
string[] Nazwisko = { "Wieczorek", "Stępień", "Pawlak", "Baran", "Wróblewski", "Ostrowski", "Zając", "Adamczyk", "Walczak", "Michalak", "Jaworski" };
Random losuj = new Random();
List<Person> list = new List<Person>();
XmlTextWriter writer = new XmlTextWriter("osoby.xml", System.Text.Encoding.UTF8);
writer.WriteStartDocument(true);
writer.Indentation = 2;
writer.WriteStartElement("Osoby");
for (int i = 0; i < 500; i++)
{
var name = Imie[losuj.Next(0, 7)];
var lastname = Nazwisko[losuj.Next(0, 7)];
var presentInList = list.Where(p => p.Name == name && p.Lastname == lastname).FirstOrDefault();
if (presentInList == null)
{
list.Add(new Person { Name = name, Lastname = lastname });
createNode(i.ToString(), name, lastname, losuj.Next(1, 50).ToString(), writer);
}
}
writer.WriteEndElement();
writer.WriteEndDocument();
writer.Close();
MessageBox.Show("Utworzono plik XML,teraz możesz zapisać plik XML do pliku TXT ! ");
}
}
公共部分类表单1:表单
{
公共表格1()
{
初始化组件();
}
班主任
{
公共字符串名称{get;set;}
公共字符串Lastname{get;set;}
}
私有void createNode(字符串pID、字符串pName、字符串pSurname、字符串页、XmlTextWriter)
{
作者:书面声明(“Osoba”);
writer.writeStarElement(“Id”);
writer.WriteString(pID);
writer.writeedelement();
作者。书面声明(“Imie”);
writer.WriteString(pName);
writer.writeedelement();
作者:书面声明(“纳兹维斯科”);
writer.WriteString(pSurname);
writer.writeedelement();
作者。书面声明(“Wiek”);
writer.WriteString(第页);
writer.writeedelement();
writer.writeedelement();
}
私有无效按钮1\u单击\u 1(对象发送者,事件参数e)
{
字符串[]Imie={“安娜”、“皮奥特”、“卡塔尔兹纳”、“安德烈”、“玛戈尔扎塔”、“扬”、“阿格涅斯卡”、“斯坦尼斯•胡”、“芭芭拉”、“托马斯兹”、“马辛”、“马雷克”、“玛格达莱娜”、“乌卡斯”};
字符串[]Nazwisko={“Wieczorek”、“Stępień”、“Pawlak”、“Baran”、“Wróblewski”、“Ostrowski”、“Zając”、“Adamczyk”、“Walczak”、“Michalak”、“Jaworski”};
Random losuj=新的Random();
列表=新列表();
XmlTextWriter=newXMLTextWriter(“osoby.xml”,System.Text.Encoding.UTF8);
writer.WriteStartDocument(true);
writer.Indentation=2;
writer.WriteStarteElement(“Osoby”);
对于(int i=0;i<500;i++)
{
var name=Imie[losuj.Next(0,7)];
var lastname=Nazwisko[losuj.Next(0,7)];
var presentInList=list.Where(p=>p.Name==Name&&p.Lastname==Lastname).FirstOrDefault();
if(presentList==null)
{
添加(新的人{Name=Name,Lastname=Lastname});
createNode(i.ToString(),name,lastname,losuj.Next(1,50).ToString(),writer);
}
}
writer.writeedelement();
writer.WriteEndDocument();
writer.Close();
Show(“Utworzono plik XML,teraz możesz zapisaćplik XML do pliku TXT!”);
}
}
将人员存储在列表中以进行唯一性测试的缺点是时间复杂度随着O(n^2)
的增加而增加(循环人员是线性的,而测试是线性的,这与n^2相结合)。要获得线性复杂度O(n)
请使用HashSet
(循环人员是线性的,插入时自动完成的测试是常量)
要使用哈希集,请创建Person类并重写Equals
和GetHashCode
:
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public override bool Equals(object obj)
{
if (obj is Person other) {
return FirstName == other.FirstName && LastName == other.LastName;
}
return false;
}
public override int GetHashCode()
{
unchecked {
return 17 * FirstName.GetHashCode() + LastName.GetHashCode();
}
}
}
为了简单起见,我没有检查空值
var persons = new HashSet<Person>();
while (persons.Count < 500) {
var p = new Person { FirsName = ..., LastName = ... };
persons.Add(p);
}
使用创建和添加元素
var element = new XElement("Osoba",
new XElement("Id", 1),
new XElement("Imie", "Jan"),
new XElement("Nazwisko", "Kowalski"),
new XElement("Wiek", 23)
);
root.Add(element);
最后用
doc.Save(filename);
您有数组-您可以使用LINQ查询,运算符Distinct()将清除重复项。保留写入XML文件的缓冲区列表,就这样。LINQ willl help.Form1.Person.Name,Form1.Person.Lastname由于其保护级别而无法访问。如何修复它?抱歉,我的邮件我忘记将属性公开。已编辑。好的,可以使用thx…但还有另一个问题:“!”运算符无法应用于“Form1.Person”类型的操作数抱歉,Javascript太多。现在试试。没问题:)这是我在c语言的开始#
doc.Save(filename);