0

我有 2 个从数据库中获取的对象数组,有些重叠,所以我必须创建一个不同的函数。

我试图制作一个 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();..我想知道什么以及如何才能只获得不同的对象..?

4

3 回答 3

5

Distinct将使用EqualsandGetHashCode来确定相等的值。我怀疑您没有覆盖这些方法来指示您希望如何检查相等性。

另请注意,您的最后一部分会更简单:

ArtObject[] art = pinui.Union(c1).OrderByDescending(a => a.dateTosort).ToArray();

a.Union(b)相当于a.Concat(b).Distinct()

GetHashCode覆盖and的另一种方法Equals是指定一个IEqualityComparer<Person>toUnionDistinct

MoreLINQ使用以下方法使这更容易DistinctBy

var query = collection.DistinctBy(x => x.Description);

(目前还没有等价物Union,但我们可以很容易地添加一个。)

于 2012-09-20T09:17:56.550 回答
2

您的代码看起来不错,尽管可以缩短(无需使用 CopyTo):

 var art = pinui.Union(c1).OrderByDescending(a => a.dateTosort).ToArray();

Union已经删除了像Distinct.

对象没有被检测为重复的原因可能是因为它们是不同的。例如,默认情况下,

 var obj1 = new ArtObject("Picasso");
 var obj2 = new ArtObject("Picasso");

是两个不同的对象。

但是,您可以为or提供自定义相等比较器,链接的 MSDN 页面包含一个很好的示例。DistinctUnion

于 2012-09-20T09:19:52.963 回答
2

如果您在其中一个字段上做不同,您可以使用GroupBythen get First

pinui.Concat(c1).GroupBy(a => a.Description, (key, g) => g.First())
    .OrderByDescending(a => a.dateTosort).ToArray();
于 2012-09-20T09:40:39.480 回答