2012-09-20 25 views
0

我有2个对象数组,我从数据库中获得一些重叠,所以我必须做出明显的功能。2 array into 1,lambda exp distinct

我试图做一个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

你需要不同的哪场? –

+0

@CongLong ArtObject descreption – thormayer

回答

2

如果您在其中一个字段做不同的,你可以使用GroupBy然后得到First

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

谢谢,它帮助! – thormayer

5

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

还要注意的是你的最后一部分是简单,因为:

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

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

的替代方法重写GetHashCodeEquals是指定一个IEqualityComparer<Person>要么UnionDistinct

MoreLINQ使得与DistinctBy方法更容易些:

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

(有没有类似Union,但我们可以easliy添加一个。)

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页面包含一个很好的示例。

+0

@PaoloMoretti:谢谢,修正了这个问题。 – Heinzi