如果linq尚未提供,请添加到集合中

时间:2016-12-14 08:09:00

标签: c# linq collections

我在C#中有一个存储人员数据的集合。 现在我想更新集合列表。 在我更新列表中的任何对象之前,我想检查该人是否已经存在。所有人都有9个比例。如果存储的数据已经存在于集合中,我想通过两个属性进行检查。

如果此人已经存在,我想删除旧数据,并希望保存新数据中的所有属性 如果该人不存在,我想用新数据创建一个新对象 我从外部文件中读取新数据并将其保存到收集列表中 旧数据存储在xml文件中,然后将其加载到集合列表中。

到目前为止我的方法:

将新人添加到列表中,即使是可用的。然后删除重复项并暂停稍后添加到列表中的人员。

在使用person.nameperson.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的新手,所以我有意识到它。

3 个答案:

答案 0 :(得分:1)

这应该有效

list.AsEnumerable().Select(person => ((person.name.Equals(toAdd.name) && person.sName.Equals(toAdd.sName))) ? toAdd : person);

基本上,您选择所有具有所需namesname的内容,并将其替换为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