C#LINQ Distinct(IEqualityComparer)帮助

时间:2011-08-15 02:49:26

标签: c# linq list generics

我有一个通用列表,用户可以在其中添加文件。如果源已经存在于列表中的另一个对象中,我试图让它删除一个对象。我还要提到我是使用System.Linq的新功能的新手。

MediaInfo类型的列表:

public static List<MediaInfo> imagePlaylist = new List<MediaInfo>();

这是MediaInfo结构和IEqualityComparer的代码:

public struct MediaInfo
{
    public string source;
    public char? type;        
}
public class MediaInfoComparer : IEqualityComparer<MediaInfo>
{
    public bool Equals(MediaInfo x, MediaInfo y)
    {
        return Convert.ToBoolean(string.Compare(x.source, y.source, true));

    }

    public int GetHashCode(MediaInfo obj)
    {
        if (Object.ReferenceEquals(obj, null)) return 0;
        int hashProductName = obj.source == null ? 0 : obj.source.GetHashCode();
        int hashProductCode = obj.type.GetHashCode();
        return hashProductName ^ hashProductCode;
    }
}

我不明白为什么Distinct(IEqualityComparer)无效。

imagePlaylist = imagePlaylist.Distinct(new MediaInfoComparer()).ToList();

谢谢,

2 个答案:

答案 0 :(得分:3)

字符串比较返回负数,0或正数;它不是布尔运算。有关详细信息,请参阅this链接。所以你会有两种情况,它返回false,一种情况,它返回true。另外,它返回true的情况是字符串实际上不相同时。

基本上,你需要做的是:

return string.Compare(x.source, y.Source, true) == 0;

答案 1 :(得分:1)

IEqualityComparer逻辑向后:

当2个字符串相等时,

string.Compare将返回0

当参数为false时,

Convert.ToBoolean将返回0