在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()