假设我有一个定义为
的类class Object
{
public int ID { get;set; }
public string Property { get; set; }
public override bool Equals(object obj)
{
Object Item = obj as Object;
return Item.ID == this.ID;
}
public override int GetHashCode()
{
int hash = 13;
hash = (hash * 7) + ID.GetHashCode();
return hash;
}
}
两个列表,定义如下:
List<Object> List1;
List<Object> List2;
这两个列表包含ID
字段可能相同的对象,但Property
字段可能有也可能没有。我希望得到List1
中包含的所有对象的结果以及List2, with the condition that
属性field must be set to
中包含的所有对象“1”if it is set to
“1”` 。结果必须包含不同的值(不同的ID)。
例如,如果我们有两个这样的列表:
List1
-----
ID = 0, Property = "1"
ID = 1, Property = ""
ID = 2, Property = "1"
ID = 3, Property = ""
List2
-----
ID = 1, Property = "1"
ID = 2, Property = ""
ID = 3, Property = ""
我需要一个看起来像这样的结果:
Result
-------
ID = 0, Property = "1"
ID = 1, Property = "1"
ID = 2, Property = "1"
ID = 3, Property = ""
目前它的工作原理如下:
var Result = List1.Except(List2).Concat(List2.Except(List1));
var Intersection = List1.Intersect(List2).ToList();
Intersection.ForEach(x => {
x.Property = List1.Single(y => y.ID == x.ID).Property == "1" ? "1" : List2.Single(y => y.ID == x.ID).Property == "1" ? "1" : "";
});
Result = Result.Concat(Intersection);
......但ForEach非常慢。有人可以建议更快的方式吗?
答案 0 :(得分:2)
var result = List1.Concat(List2)
.GroupBy(o => o.ID)
.Select(g => new Object() {
ID=g.Key,
Property=g.Any(o=>o.Property=="1")?"1":""
})
.ToList();
答案 1 :(得分:1)
var result = List1.Concat(List2)
.OrderByDescending(o => o.Property)
.GroupBy(g => o.ID)
.Select(g => g.First())
.ToList();