J'ai un protocole basé sur l'interrogation et je veux profiter de RX pour le transformer en un push. Toutes les x secondes je demande des Tags (nom et valeur) en utilisant le protocole, et je les récupère.RX - Erreur distincte avec la personnalisation IEqualityComparer
Je ne suis intéressé que par le changement de valeurs dans les balises, et j'utilise donc la fonction DistinctUntilChanges.
this.TagsChangeNotifier = _tags
.Select(tag =>
{
return Observable
.Interval(ts)
.Select(_ => { return tag; })
.DistinctUntilChanged(new DataTagComparer());
})
.Merge();
Et voici la classe DataTagcomparer.
public class DataTagComparer : IEqualityComparer<DataTag>
{
public bool Equals(DataTag x, DataTag y)
{
b = y.WeakRawValue.ToByteArray().SequenceEqual(x.WeakRawValue.ToByteArray());
return b;
}
public int GetHashCode(DataTag obj)
{
return obj.Name.GetHashCode();
}
}
Mais ça ne marche pas, parce que je ne vois jamais de comparaison entre 2 valeurs différentes. Voici un exemple.
Start program: DataTag("Test",1)
Equals called: x = ("Test",1), y = ("Test",1)
Attendre 10 secondes et le changement de protocole pour revenir 2 au lieu de 1.
Equals called: x = ("Test",1), y = ("Test",1)
Equals called: x = ("Test",2), y = ("Test",2)
Equals called: x = ("Test",2), y = ("Test",2)
Equals called: x = ("Test",2), y = ("Test",2)
et ainsi de suite.
La partie étrange est qu'il manque complètement la comparaison entre la valeur précédente et la valeur actuelle! Savez-vous quel peut être le problème? En fait, je travaille avec cette solution de contournement terrible
public class DataTagComparer : IEqualityComparer<DataTag>
{
private object val;
public bool Equals(DataTag x, DataTag y)
{
bool b = true;
if (val != null)
b = val.ToByteArray().SequenceEqual(x.WeakRawValue.ToByteArray());
val = x.WeakRawValue;
return b;
}
public int GetHashCode(DataTag obj)
{
return obj.Name.GetHashCode();
}
}
Merci pour votre attention, Vincenzo.
EDIT: DataTag code de classe
public abstract class DataTag
{
public DataTag(string _Name, string Desc)
{
Name = _Name;
Description = Desc;
}
public string Name { get; private set; }
public string Description { get; private set; }
public abstract object WeakValue { get; }
public abstract object WeakRawValue { get; }
}
EDIT: la fonction de mise à jour Tag
this.timerHandle = Observable.Interval(ts).Select(_ => { Update(); return _; }).Publish().Connect();
Quelle est la définition de 'DataTag'? (Ou aussi simplifié une version que vous pouvez coller dedans qui agit toujours de cette façon) – JerKimball
Fait, c'est la version complète. – Vincenzo