2016-12-14 65 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