我有两个从数据库中获取的对象数组,有些重叠,所以我必须创建一个独特的函数。
我尝试制作一个lambda表达式,但我仍然有一个重叠的对象。
这是我的代码:
ArtObject[] pinui = new ArtObject[root.Count - 1];
ArtObject[] c1= new ArtObject[root2.Count - 1];
pinui = getArticlesArray(root2, pinui);
c1= getArticlesArray(root, c1);
art = new ArtObject[c1.Count()+pinui.Count()];
pinui.CopyTo(art, 0);
c1.CopyTo(art, pinui.Count());
art = art.Distinct().OrderByDescending(a => a.dateTosort).ToArray();
我觉得我的最后一行art = art.Distinct().OrderByDescending(a => a.dateTosort).ToArray();
出了问题。我想知道什么,怎样才能得到不同的对象..?
答案 0 :(得分:5)
Distinct
将使用Equals
和GetHashCode
来确定相等的值。我怀疑你没有覆盖这些方法,以表明你希望如何检查相等性。
另请注意,您的最后一部分将更简单:
ArtObject[] art = pinui.Union(c1).OrderByDescending(a => a.dateTosort).ToArray();
a.Union(b)
相当于a.Concat(b).Distinct()
。
覆盖GetHashCode
和Equals
的替代方法是为IEqualityComparer<Person>
或Union
指定Distinct
。
MoreLINQ使用DistinctBy
方法更轻松:
var query = collection.DistinctBy(x => x.Description);
(目前还没有Union
的等价物,但我们可以轻松添加一个。)
答案 1 :(得分:2)
您的代码看起来很好,虽然它可以缩短(不需要使用CopyTo):
var art = pinui.Union(c1).OrderByDescending(a => a.dateTosort).ToArray();
Union
已删除Distinct
等重复项。
对象未被检测为重复的原因可能是因为它们是不同的。例如,默认情况下,
var obj1 = new ArtObject("Picasso");
var obj2 = new ArtObject("Picasso");
是两个截然不同的对象。
但是,您可以provide a custom equality comparer到Distinct
或Union
,链接的MSDN页面包含一个很好的示例。
答案 2 :(得分:2)
如果您对其中一个字段执行了区分,则可以使用GroupBy
然后获取First
:
pinui.Concat(c1).GroupBy(a => a.Description, (key, g) => g.First())
.OrderByDescending(a => a.dateTosort).ToArray();