2016-12-14 39 views
0

我有一个在C#中存储人的数据的集合。 现在我想更新收藏列表。 在我更新列表中的任何对象之前,我想检查该人是否已经存在。所有人有9个比例。如果存储的数据已经在集合中,我想检查两个属性。添加到收藏,如果尚未与linq

如果这个人已经存在,我想删除旧数据并想保存新数据的所有属性。
如果此人不存在,我想用新数据创建一个新对象。
我从外部文件中读取的新数据并将其保存到收集列表中。
旧数据存储在一个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,所以我有问题要意识到它。

回答

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,并创建一个新的:

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); 
+0

就是这样,非常感谢!我用foreach循环第一个列表并比较属性。 – swtch3k

+0

如何比较名称和名称,如果两者都是字符串。我试过Equals和Contains都有例外吗? (NullRefernceException) – swtch3k

+0

把它加入try catch – swtch3k

1

这应该工作

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

基本上,你选择所有那些有name,并要与toAdd替换它们(这是Person要添加)sname。如果所选项目不符合标准,则不会被替换。

+0

谢谢你的方法! – swtch3k

+0

@ swtch3k不客气。 – ItamarG3

1

你必须使用拉姆达为选择一个人

Person person = list.FirstOrDefault(p => p.name == "NameToAdd" && p.sname == "SNameToAdd"); 

您还可以使用的SingleOrDefault代替,如果你确信只有一个这样的元素应该集合中存在。 FirstOrDefault/SingleOrDefault将返回一个人或null,如果它不会找到任何匹配传入的条件

+0

谢谢你的解决方案! – swtch3k