Jav*_*der 7 .net c# linq entity-framework distinct
我有一个对象列表,其中一些具有相同的ID,所以我想删除那些重复的元素.
我尝试过这样的事情:
List<post> posts = postsFromDatabase.Distinct().ToList();
Run Code Online (Sandbox Code Playgroud)
但它不起作用!
所以我写了这个方法以避免重复:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
任何关于如何提高性能的想法?
Thanx提前.
Pio*_*yna 26
这很简单:
List<Post> posts = posts
.GroupBy(x => x.Id)
.Select(x => x.FirstOrDefault())
Run Code Online (Sandbox Code Playgroud)
但如果你想以正确的方式写它,我建议你这样写:
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
}
Run Code Online (Sandbox Code Playgroud)
因为它会给你更多的自由,当涉及到额外的比较.写完这个课你可以像这样使用它:
List<Post> posts = postsFromDatabase.Distinct(new PostComparer()).ToList();
Run Code Online (Sandbox Code Playgroud)
我认为编写自己的自定义比较器是一种很好的方法.
这是msdn中的一篇文章,非常好地解释了这个主题:http://support.microsoft.com/kb/320727
Distinct没有工作的原因是Distinct()不知道如果有等于detine,所以它使用引用来确定它是相同的"对象".它的工作方式就像工作一样.查询中的所有类都不是同一个对象.
通过编写自己的比较器(很容易),您可以告诉Distinct()如何进行比较以确定它们是否相等.
编辑:如果不使用Distinct不是问题而且情况不是frecuent,Piotr Justyna的第一个答案就是简单而有效.
| 归档时间: |
|
| 查看次数: |
18977 次 |
| 最近记录: |