2013-03-28 2 views
0

также с использованием библиотек утверждения с помощью методов, посвященных сопоставлению списка, я не в состоянии соответствовать этим два результата в модульных тестах:Кортежа структурной идентичность

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 

Единственный способ, чтобы получить положительный результат матча разлагающихся в кортеж и сопоставление Item2 с помощью метода, который поддерживает сравнение списков.

Есть ли способ без этого?

+0

Вы можете создать свой собственный класс с избыточным равным, тогда вы можете использовать 'result = list1.SequenceEqual (list2);' –

ответ

3

Вы можете использовать SequenceEqual метод расширения:

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

Возвращает true для ввода образца.

Причина, по которой вы должны сделать это явно, и не работает по умолчанию, когда два экземпляра Tuple<string, IEnumerable<string>> сравниваются с номером Tuple. Согласно MSDN, оба компонента проверяются повторно друг на друга, чтобы решить, равны ли Tuple s. Поскольку второй - Array, используется стандартный сравнительный сопоставитель. И поскольку ваши Tuple s не указывают на тот же Array в памяти, он возвращает false.

Stardard .Any(a.Equals) будет работать, если только ваши Tuple объекты, указывающие на тот же массив:

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)); 

Возвращает true, а также.

+0

+1 это работает и допускает краткий синтаксис. Также, если он разложил кортежи, это нормально для меня; потому что он достаточно синтетический, чтобы вписаться в «Assert.True». – jay

+0

да, я согласен: это причина. Я просто задавался вопросом, написал ли кто-нибудь единый метод тестирования, который охватывает случай ... – jay

Смежные вопросы