在实体框架中有所区别

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)

  • 当数据在内存中时,这将处理此问题.不好.使用GroupBy-approch:http://stackoverflow.com/questions/8560884/how-to-implement-iequalitycomparer-to-return-distinct-values (3认同)
  • 我认为在`GetHashCode`中你必须使用`obj.Id.GetHashCode()`,因为对于两个根据`Equals`方法相等的对象,哈希码必须相同(至少MSDN说这个). (2认同)

Jon*_*han 5

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

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

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

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

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