我正试图抓住 Linq ,并遇到以下问题:
我有一个自定义对象列表,每个对象都有一些属性。然后我有另一个相同类型的列表,其中属性值将不同,ID属性除外。现在,我想添加在我的第一个列表(tempList
)中找不到的第二个列表(OrderList
)中找到的对象。之后,我尝试删除OrderList
中找不到tempList
中未找到的对象。
这看起来似乎有点不必要,但原因是我需要在OrderList
中保留属性的值,如果在tempList
中找到了这些属性的ID,那么就不要替换来自OrderList
的“空”属性tempList
。
代码段看起来像这样(OrderList
和tempList
已经填充了对象,而且它是我用作标识符的属性 ID :
// Add new orders from account to current object
OrderList.AddRange(tempList.Where(p => !OrderList.Any(p2 => p2.ID == p.ID)));
// Remove missing orders from our OrderList
OrderList.RemoveAll(p => !tempList.Any(p2 => p2.ID == p.ID));
由于OrderList中对象的属性在两行中的每一行之后都被重置,所以我做错了...
也许一双新鲜的眼睛能看出我做错了什么?
答案 0 :(得分:0)
试试这个:
void Main()
{
var orList = new List<A> {new A {Id = 0, S = "a"}, new A {Id = 1, S = "b"}, new A {Id = 2, S = "c"}, new A {Id = 4, S = "e"}};
var tmList = new List<A> {new A {Id = 2, S = "cc"}, new A {Id = 3, S = "dd"}};
var result = orList.Union(tmList, new AComparer()).ToList();
result.RemoveAll(a => tmList.All(at => at.Id != a.Id));
}
public class A {
public int Id;
public string S;
}
class AComparer : IEqualityComparer<A> {
public bool Equals(A x, A y) { return x.Id == y.Id; }
public int GetHashCode(A a) { return a.Id; }
}