我在C#中有一个存储人员数据的集合。 现在我想更新集合列表。 在我更新列表中的任何对象之前,我想检查该人是否已经存在。所有人都有9个比例。如果存储的数据已经存在于集合中,我想通过两个属性进行检查。
如果此人已经存在,我想删除旧数据,并希望保存新数据中的所有属性 如果该人不存在,我想用新数据创建一个新对象 我从外部文件中读取新数据并将其保存到收集列表中 旧数据存储在xml文件中,然后将其加载到集合列表中。
到目前为止我的方法:
将新人添加到列表中,即使是可用的。然后删除重复项并暂停稍后添加到列表中的人员。
或
在使用person.name
和person.sname
添加linq并使用新数据设置所有属性之前,如果不存在则创建新数据。
List<person> with {name, sname, mobile, email, adress1, adress2, fone, age, gender}
List<person> list = new List<person>;
Person person = new Person();
XDocument doc = XDocument.Load(XMLPath);
// somethink like that
list.Select(list.Name && list.sName)
where ...
我是linq的新手,所以我有意识到它。
答案 0 :(得分:1)
这应该有效
list.AsEnumerable().Select(person => ((person.name.Equals(toAdd.name) && person.sName.Equals(toAdd.sName))) ? toAdd : person);
基本上,您选择所有具有所需name
和sname
的内容,并将其替换为toAdd
(您要添加的Person
)。如果所选项目不符合条件,则不会替换它。
答案 1 :(得分:1)
嗯,解决方案取决于你没有指定的很多东西。 Person
是否可变?如果是,解决方案非常简单:
List<Person> persons = ....
var specificPerson = perons.Where(p => p.Name == something && p.Age == somethingElse).FirstOrDefault();
if (specificPerson != null) //We have a person in the list (I'm assuming Person is a class, not struct)
{
specificPerson.Name = updatedValue;
specificPerson.Age = someOtherUpdatedValue;ç
// etc.
}
else //Person is not in the list
{
var newPerson = new Person( /*new data*/ );
persons.Add(newPerson);
}
如果Person
是不可变的,那么您想要完全删除现有的Person
并创建一个新的:{/ p>
List<Person> persons = ....
var specificPerson ? Perons.Where( p => p.Name == something && p.Age == somethingElse).FirstOrDefault();
if (specificPerson != null)
{
persons.Remove(specificPerson);
}
var newPerson = new Person( /*new data*/ );
persons.Add(newPerson);
答案 2 :(得分:1)
你必须使用lambda来选择一个人
Person person = list.FirstOrDefault(p => p.name == "NameToAdd" && p.sname == "SNameToAdd");
如果您确定集合中只应存在一个此类元素,您也可以使用SingleOrDefault。 FirstOrDefault / SingleOrDefault将返回一个人,如果找不到符合标准的匹配项,则返回null