【问题标题】:C# LINQ Distinct(IEqualityComparer) helpC# LINQ Distinct(IEqualityComparer) 帮助
【发布时间】:2011-08-15 02:49:25
【问题描述】:

我有一个通用列表,用户可以在其中添加文件。如果源已存在于列表中的另一个对象中,我试图让它删除一个对象。我还要提一下,我是使用 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();

谢谢,

【问题讨论】:

    标签: c# linq list generics


    【解决方案1】:

    字符串比较返回负数、0 或正数;这不是布尔运算。有关详细信息,请参阅this 链接。因此,您将有两种情况它返回 false 和一种返回 true 的情况。此外,它返回 true 的情况是字符串实际上并不相同。

    基本上,你需要做的是:

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

    【讨论】:

      【解决方案2】:

      IEqualityComparer 逻辑倒退:

      string.Compare 将在 2 个字符串相等时返回 0

      当参数为0时,Convert.ToBoolean会返回false

      【讨论】:

      • 感谢两位的回答。我什至不认为错误出现在 string.Compare >.<.>
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-30
      • 2010-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多