在entity framework中有所区别

我有一个对象列表,其中一些具有相同的ID,所以我想删除那些重复的元素。

我尝试过这样的事情:

List posts = postsFromDatabase.Distinct().ToList(); 

但它不起作用!

所以我写了这个方法以避免重复:

 public List PostWithOutDuplicates(List posts) { List postWithOutInclude = new List(); var noDupes = posts.Select(x => x.Id).Distinct(); if (noDupes.Count()  x.Id == idPost).First()); } return postWithOutInclude; } else { return posts; } } 

有关如何提高性能的任何想法?

提前完成。

这很简单:

 List posts = posts .GroupBy(x => x.Id) .Select(x => x.FirstOrDefault()) 

但如果你想以正确的方式写它,我建议你这样写:

 public class PostComparer : IEqualityComparer { #region IEqualityComparer Members public bool Equals(Post x, Post y) { return x.Id.Equals(y.Id); } public int GetHashCode(Post obj) { return obj.Id.GetHashCode(); } #endregion } 

因为它会给你更多的自由,当涉及到额外的比较。 写完这个课你可以像这样使用它:

 List posts = postsFromDatabase.Distinct(new PostComparer()).ToList(); 

我认为编写自己的自定义比较器是一种很好的方法。

这是msdn中的一篇文章,非常好地解释了这个主题: http : //support.microsoft.com/kb/320727

Distinct没有工作的原因Distinct()不知道如果有等于detemine,所以它使用引用来确定它是相同的“对象”。 它的工作方式就像工作一样。 查询中的所有类都不是同一个对象。

通过编写自己的比较器(很容易),您可以告诉Distinct()如何进行比较以确定它们是否等于。

编辑 :如果不使用Distinct不是问题而且情况不是frecuent,Piotr Justyna的第一个答案就是简单而有效。

而不是.First(),尝试.FirstOrDefault()