C#使用Except比较列表

时间:2014-03-14 16:21:48

标签: c# visual-studio-2010 list

我已经尝试在许多其他问题上寻找答案,但它们要么似乎没有相关性,要么我只是知识不足以了解它们。

我的问题是比较两个列表(一个Twitter粉丝的朋友(或你跟随的人))

这是我用来收集列表的代码

var friends = user.GetFriends(500).ToList();
var following = user.GetFollowers(500).ToList();
var result = compareFollowingtoFollowers(friends, following);

foreach(var res in result)
{
    lstFollowerChecker.Items.Add(res.ScreenName);
}

这是我的compareFollowingtoFollowers功能

private List<T> compareFollowingtoFollowers<T>(List<T> friends, List<T> followers)
{
    var results = followers.Except(friends).ToList();
    return results;
}

我的问题是它没有返回我的期望,例如,如果我在我自己的帐户上运行这个我说100个朋友而我跟踪112个人,它应该返回12个不是以下但是它似乎只是将它们全部归还。

我使用的是正确的功能吗?我读过的其他问题让我相信。

感谢您阅读

布莱恩

更新

给出的答案已经足以让我脑子里的齿轮再次嘀嗒作响,而答案仍然略微超出我的想象,我认为它们正是我需要更好地理解为什么它是归还它做了什么,谢谢大家。

4 个答案:

答案 0 :(得分:3)

您需要使用自定义比较器来比较对象,并将.Except方法中的对象作为第二个参数传递。例如

public class User
{
    public int Id { get; set; }
}

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

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

答案 1 :(得分:2)

您使用的是正确的功能,但您的用户类未实现IEquatable<UserClass>。这意味着Except使用引用语义来比较两个用户,并且因为它们似乎是不同的对象(即使&#34;等于&#34;),它们比较不相等。因此它认为两个列表之间根本没有重叠。

解决方案是正确实现IEquatable<T>,为类提供所需的等式语义(如何完全取决于该类的属性)。

答案 2 :(得分:0)

您可以执行以下操作:

var result = myFriends.Select(x => yourFriends.All(y => y != x));

答案 3 :(得分:0)

您可能需要指定如何对类型进行比较。

根据MSDN: http://msdn.microsoft.com/en-us/library/bb300779(v=vs.110).aspx

自定义类型需要实现equals和gethashcode以进行比较。