2011-08-15 4 views
1

ユーザーがファイルを追加できる汎用リストがあります。ソースがすでにリストの別のオブジェクトに存在する場合は、オブジェクトを削除するようにしています。また、System.Linqの機能を初めて使用することについても触れておきます。C#LINQ Distinct(IEqualityComparer)help

リストタイプ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; 
    } 
} 

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

これは、MediaInfoを構造体とされたIEqualityComparerためのコードですワーキング。

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

おかげで、

答えて

3

文字列が負戻り、0、または正の比較。ブール演算ではありません。詳細については、thisリンクを参照してください。したがって、falseを返す2つの状況とtrueを返す状況があります。さらに、真を返す状況は、文字列が実際には同じでない場合です。

基本的に、何をする必要があると、このさ:IEqualityComparer論理が逆方向にある

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

:2つの文字列が等しいとき

string.Compare0を返します。

Convert.ToBooleanは、パラメータが0の場合、falseを返します。

+0

お返事ありがとうございます。エラーが文字列内にあるとは思わなかった。比較>。<。 – zaza