2013-03-28 4 views
0

en utilisant également des bibliothèques d'affirmation des méthodes consacrées à comparer la liste, je suis incapable de faire correspondre ces deux résultats dans les tests unitaires:Tuple identité structurelle

var list1 = new List<Tuple<string, IEnumerable<string>>> 
{ 
    Tuple.Create<string,IEnumerable<string>>("string", new[] { "value" }) 
}; 

var list2 = new List<Tuple<string, IEnumerable<string>>> 
{ 
    Tuple.Create<string,IEnumerable<string>>("string", new[] { "value" }) 
}; 


var result = list1.All(a => list2.Any(a.Equals)); // result false 

La seule façon d'obtenir un match positif est décomposition la tuple et correspondant Item2 avec une méthode qui prend en charge la comparaison des listes.

Il y a un moyen sans le faire?

+0

Vous pouvez créer votre propre classe avec égaux outrepassée, vous pouvez utiliser 'result = list1.SequenceEqual (list2)' –

Répondre

3

Vous pouvez utiliser SequenceEqual méthode d'extension:

var result = list1.All(a => list2.Any(x => x.Item1 == a.Item1 && x.Item2.SequenceEqual(a.Item2))); 

Retours true pour votre entrée de l'échantillon.

La raison pour laquelle vous devez le faire explicitement et ne fonctionne pas par défaut lorsque deux instances Tuple<string, IEnumerable<string>> sont comparées est le deuxième élément Tuple. Selon MSDN, les deux composants sont vérifiés entre eux pour décider si Tuple sont égaux. Parce que le deuxième est un Array référence standard référence d'égalité est utilisé. Et parce que vos Tuple ne pointent pas vers la même Array en mémoire, elle renvoie false.

Stardard .Any(a.Equals) fonctionnerait si seulement vos Tuple objets pointant vers le même tableau:

var array = new[] { "value" }; 

var list1 = new List<Tuple<string, IEnumerable<string>>> 
{ 
    Tuple.Create<string,IEnumerable<string>>("string", array) 
}; 

var list2 = new List<Tuple<string, IEnumerable<string>>> 
{ 
    Tuple.Create<string,IEnumerable<string>>("string", array) 
}; 

var result = list1.All(a => list2.Any(a.Equals)); 

Retours true ainsi.

+0

+1 cela fonctionne et permet une syntaxe laconique. Aussi, si ça décompose les tuples, c'est bon pour moi; parce qu'il est assez synthétique pour tenir dans un 'Assert.True'. – jay

+0

oui je suis d'accord: c'est la raison. Je me demandais juste si quelqu'un a écrit une méthode de test unitaire qui couvre le cas ... – jay