C# 正在从类中的列表属性中删除元素

C# 正在从类中的列表属性中删除元素,c#,xml,linq,C#,Xml,Linq,C#System.XML.Serialization中序列化了一个XML数据 有一个根类描述根元素。它包含子类(如电影)中描述的列表类型的文件 我可以将XML文档反序列化为一个类,并使用list.add或list.Insert在列表中添加新元素: cfg.Movies.Insert(0, new Movie("Newly added: Pulp Fiction", "1994")); 但反向操作不起作用: cfg.Movies.Remove(new Movie("To be removed:

C#System.XML.Serialization中序列化了一个XML数据

有一个根类描述根元素。它包含子类(如电影)中描述的列表类型的文件

我可以将XML文档反序列化为一个类,并使用list.add或list.Insert在列表中添加新元素:

cfg.Movies.Insert(0, new Movie("Newly added: Pulp Fiction", "1994"));
但反向操作不起作用:

cfg.Movies.Remove(new Movie("To be removed: The Godfather", "1974"));
所以问题是如何从xml类列表中删除元素

样本如下:

使用系统;
使用System.IO;
使用System.Xml;
使用System.Xml.Linq;
使用System.Collections.Generic;
使用System.Xml.Serialization;
公共课程
{
公共静态void Main()
{
字符串xmlString=
@"
";
XDocument xdoc=XDocument.Parse(xmlString);
var xdocData=xdoc.ToString();
//反序列化
XmlSerializer serializer=新的XmlSerializer(typeof(Favorites));
使用(StringReader=newStringReader(xdoc.ToString()))
{
收藏夹cfg=(收藏夹)序列化程序。反序列化(读取器);
//添加和删除元素
插入(0,新电影(“新增:低俗小说”,“1994”);
电影移除(新电影(“待移除:教父”,“1974”);
//系列化
XmlSerializer serializer2=新的XmlSerializer(cfg.GetType());
使用(StringWriter=新StringWriter())
{
serializer2.序列化(writer,cfg);
Console.WriteLine(writer.ToString());
}
}
}
[XmlRoot(ElementName=“favorites”,DataType=“string”,IsNullable=true)]
公共类收藏夹
{
//公共字符串名称{get;set;}
[XmlArray(“电影”)]
[XmlArrayItem(“电影”)]
公共列表电影{get;set;}
公共收藏夹()
{
电影=新列表();
}
}
公映
{
[XmlAttribute(“标题”)]
公共字符串标题{get;set;}
[XmlAttribute(“年度”)]
公共字符串年份{get;set;}
公共电影(){}
公共电影(字符串标题,字符串年份)
{
头衔=头衔;
年=年;
}
}
}

创建新对象时,其引用尚未在列表中。您需要在列表中搜索要删除的项目,然后使用搜索结果将其删除

比如:

var movieToRemove = cfg.Movies.SingleOrDefault(m => m.Title == "To be removed: The Godfather" && m.Year == "1974");
if (moveiToRemove != null)
  cfg.Movies.Remove(movieToRemove);

您正在尝试删除新电影,而不是反序列化的电影

您必须先在列表中找到电影,然后将其删除

替换

cfg.Movies.Remove(new Movie("To be removed: The Godfather", "1974"));


创建新对象时,其引用尚未在列表中。您需要在列表中搜索要删除的项目,然后使用搜索结果将其删除。类似于:
var toRemove=cfg.Movies.Single(m=>m.Title==“待删除:教父”&&m.Year==“1974”);cfg.Movies.Remove(删除)
;它不是一个“xml类”。它只是一个普通类,碰巧有序列化属性。这个请求和昨天的请求有什么区别@jdweng,这是完全不同的问题,它们只有相似的xml数据。第一个涉及过滤xml节点,而这一个具体涉及使用XmlArray和List的操作。谢谢。你能解释一下这里发生了什么吗?cfg.Movies.SingleOrDefault(m=>m.Title==“被删除:教父”&&m.Year==“1974”)?可以用其他方式描述它吗?它是一个Linq查询,只选择列表中的一项。如果没有一个项目或有多个项目符合条件,则返回默认值(通常为空)。标准是每个对象的
标题
年份
必须匹配
m
。如果列表中没有匹配的元素,我会得到例外。。有没有一种不用try-catch就可以处理这个问题的方法?你不应该得到任何异常。你应该得到
null
。这里缺少知识:(cfg.Movies.Find(x=>x.Title==“新添加的:低俗小说”)-它是如何工作的?有没有办法在没有“=>”的情况下编写相同的代码?“x=>x.Title==“新添加的:低俗小说”是一个谓词指令,它基本上说:给我“x”“出现在我的电影列表中,其中x.Title等于“新增:低俗小说”。这是由C#的LINQ feautre实现的。这里有一篇教程,让您了解it教程的基础知识Point.com/LINQ/LINQ#u overview.htm还有为什么不使用这种语法?谢谢。我更喜欢使用我理解得很好的东西,而LINQ现在对我来说还不是完全清楚的主题。所以我只是想知道-它像语法吗ugar,或者在这种情况下它没有其他选择?您可以从循环到电影列表开始,如果其中一部电影的标题为所查找的值,则将其存储在变量中。然后继续从列表中删除包含事件的变量
cfg.Movies.Remove(new Movie("To be removed: The Godfather", "1974"));
cfg.Movies.Remove(cfg.Movies.Find(x => x.Title == "Newly added: Pulp Fiction"));