我已经尝试在许多其他问题上寻找答案,但它们要么似乎没有相关性,要么我只是知识不足以了解它们。
我的问题是比较两个列表(一个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个不是以下但是它似乎只是将它们全部归还。
我使用的是正确的功能吗?我读过的其他问题让我相信。
感谢您阅读
布莱恩
更新
给出的答案已经足以让我脑子里的齿轮再次嘀嗒作响,而答案仍然略微超出我的想象,我认为它们正是我需要更好地理解为什么它是归还它做了什么,谢谢大家。
答案 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以进行比较。