我有一个对象列表,其中一些具有相同的ID,所以我想删除那些重复的元素。
我试过这样的事情:
List<post> posts = postsFromDatabase.Distinct().ToList();
但它不起作用!
所以我写了这个方法以避免重复:
public List<Post> PostWithOutDuplicates(List<Post> posts)
{
List<Post> postWithOutInclude = new List<Post>();
var noDupes = posts.Select(x => x.Id).Distinct();
if (noDupes.Count() < posts.Count)
{
foreach (int idPost in noDupes)
{
postWithOutInclude.Add(posts.Where(x => x.Id == idPost).First());
}
return postWithOutInclude;
}
else
{
return posts;
}
}
关于如何提高性能的任何想法??
提前完成。
答案 0 :(得分:26)
这很简单:
List<Post> posts = posts
.GroupBy(x => x.Id)
.Select(x => x.FirstOrDefault())
但是如果你想以正确的方式写它,我建议你这样写:
public class PostComparer : IEqualityComparer<Post>
{
#region IEqualityComparer<Post> 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<Post> posts = postsFromDatabase.Distinct(new PostComparer()).ToList();
答案 1 :(得分:5)
我认为编写自己的自定义比较器是一种很好的方法。
msdn中的一篇文章很好地解释了这个主题:http://support.microsoft.com/kb/320727
Distinct没有工作的原因Distinct()不知道如果有等于detemine,所以它使用引用来确定它是相同的“对象”。它的工作方式就像工作一样。查询中的所有类都不是同一个对象。
通过编写自己的比较器(很容易),您可以告诉Distinct()如何进行比较以确定它们是否相等。
编辑:如果不使用Distinct不是问题而且情况不是frecuent,那么Piotr Justyna的第一个答案就是简单而有效。
答案 2 :(得分:1)
而不是.First(),请尝试.FirstOrDefault()