2个数组为1,lambda exp不同

时间:2012-09-20 09:15:24

标签: c# lambda

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

我尝试制作一个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();出了问题。我想知道什么,怎样才能得到不同的对象..?

3 个答案:

答案 0 :(得分:5)

Distinct将使用EqualsGetHashCode来确定相等的值。我怀疑你没有覆盖这些方法,以表明你希望如何检查相等性。

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

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

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

覆盖GetHashCodeEquals的替代方法是为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 comparerDistinctUnion,链接的MSDN页面包含一个很好的示例。

答案 2 :(得分:2)

如果您对其中一个字段执行了区分,则可以使用GroupBy然后获取First

pinui.Concat(c1).GroupBy(a => a.Description, (key, g) => g.First())
    .OrderByDescending(a => a.dateTosort).ToArray();