2013-12-18 36 views
5

我有一个程序,有一个主题(如论坛),人们可以对该主题作出反应。不同的对象列表编号

USER:

  1. ID
  2. 名字
  3. 姓氏

话题:

  1. ID
  2. 主题

反应:

  1. ID
  2. topic_id
  3. 内容

代码:

List<USER> ListOfAllUsers = new List<USER>(); 
var AllReactions = from r in db.REACTIONs 
        where r.topic_id == _topic_id 
        select r; 

foreach (var itemX in AllReactions) 
{ 
    ListOfAllUsers.Add(itemX.USER); 
} 

//Distinct the list of duplicates 
var ListOfUsers = ListOfAllUsers.Distinct().ToList(); 

现在, “独特” 列表中仍然有一些重复,如何我清楚列表基于用户标识的?或者也许有另一种更好的方法来做到这一点。提前致谢。

回答

10

您可以使用GroupBy实现这一

var ListOfUsers = ListOfAllUsers.GroupBy(x => x.Id) 
            .Select(g => g.First()) 
            .ToList(); 
+1

谢谢,这对我的作品! –

+0

和downvote是为了什么?OP表示它为他工作了 – wudzik

+1

+1同意,解决方案正在工作。它不应该downvoted(特别是没有任何意见) –

3

我建议你让数据库返回不同的用户对你:

List<USER> ListOfAllUsers = 
     db.REACTIONs.Where(r => r.topic_id == _topic_id) 
        .Select(r => r.USER) 
        .Distinct() 
        .ToList(); 

将被翻译成单个SQL查询。喜欢的东西(假设你的用户表有两列 - 编号和名称):

SELECT 
    [Distinct1].[Id] AS [Id], 
    [Distinct1].[Name] AS [Name] 
    FROM (SELECT DISTINCT 
     [Extent2].[Id] AS [Id], 
     [Extent2].[Name] AS [Name] 
     FROM [dbo].[USER] AS [Extent1] 
     INNER JOIN [dbo].[REACTION] AS [Extent2] 
      ON [Extent1].[Id] = [Extent2].[UserId] 
     WHERE @id = [Extent1].[topic_id] 
    ) AS [Distinct1] 
2

Distinct具有接收的IEqualityComparer<T>一个实例,这是一个包含允许LINQ知道这两个对象的逻辑对象的过载是平等的,因此应该被淘汰。

你需要实现这个(很简单)接口,这样的事情:

public class UserEqualityComparer : IEqualityComparer<User> 
{ 
     public bool Equals(User x, User y) 
     { 
      return x.Id == y.Id; 
     } 

     public int GetHashCode (User obj) 
     { 
      return obj.Id.GetHashCode(); 
     } 
} 

再通UserEqualityComparer一个实例Distinct()

var ListOfUsers = ListOfAllUsers.Distinct(new UserEqualityComparer()).ToList(); 
+0

与Linq解决方案相比,是否有任何优势/劣势? –

1

MoreLinq(可上的NuGet)已DistincBy方法,允许您使用委托作为相等比较器。

所以你只需要做这样的事情:

var ListOfUsers = ListOfAllUsers.DistinctBy(user => user.id).ToList(); 

编辑:MoreLinq Link

+0

在这里您可以找到distinctby扩展方法代码:http://stackoverflow.com/a/20397508/1714342 – wudzik

相关问题