2011-08-15 3 views
1

J'ai une liste générique où l'utilisateur peut ajouter des fichiers. J'essaye de l'obtenir pour supprimer un objet si la source existe déjà dans un autre objet dans la liste. Je mentionnerai également que je suis nouveau à l'utilisation des fonctionnalités de System.Linq.C# LINQ Distinct (IEqualityComparer) aide

La liste si le type MediaInfo:

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

C'est le code de la struct MediaInfo et 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; 
    } 
} 

Je ne comprends pas pourquoi le Distinct (IEqualityComparer) n'est pas travail.

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

Merci,

Répondre

3

chaîne comparer les rendements négatifs, 0 ou positif; ce n'est pas une opération booléenne. Voir le lien this pour plus de détails. Donc vous auriez deux situations où elle renvoie false, et une où elle renvoie true. En outre, la situation où elle renvoie true est lorsque les chaînes ne sont pas réellement les mêmes.

Fondamentalement, ce que vous devez faire est la suivante:

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

La logique IEqualityComparer est en arrière:

string.Compare renverra 0 quand 2 chaînes sont égales.

Convert.ToBoolean renverra false lorsque le paramètre est 0.

+0

Merci à vous deux pour les réponses. Je ne pensais même pas que l'erreur était dans string.Compare>. <. – zaza