2015-07-02 2 views
1

У меня есть список массивов, и мне нужно проверить, существуют ли массивы в списке. Как это:странное поведение Contains() в списке массивов

Guid guid1 = Guid.NewGuid(); 
Guid guid2 = Guid.NewGuid(); 

List<Guid[]> listOfArrays = new List<Guid[]>(); 

listOfArrays.Add(new[] { guid1, guid2}); 

if (listOfArrays.Contains(new[] { guid1, guid2 })) 
    Console.WriteLine(@"List of Array contains guid1 and guid2"); 
else 
    Console.WriteLine(@"List of Array does not contains guid1 and guid2"); 

Console.ReadKey(); 

Выход:

Список массив не содержит guid1 и GUID2

Однако, если я использую список кортежей вместо массива, все работает как я ожидаю

Guid guid1 = Guid.NewGuid(); 
Guid guid2 = Guid.NewGuid(); 

List<Tuple<Guid, Guid>> listOfTuples = new List<Tuple<Guid, Guid>>(); 

listOfTuples.Add(new Tuple<Guid, Guid>(guid1, guid2)); 

if (listOfTuples.Contains(new Tuple<Guid, Guid>(guid1, guid2))) 
    Console.WriteLine(@"List of Tuple contains guid1 and guid2"); 
else 
    Console.WriteLine(@"List of Tuple does not contains guid1 and guid2"); 

Console.ReadKey(); 

выход:

Список кортежей содержит guid1 и guid2

Так что мой вопрос: почему это происходит? Массивы и кортежи являются ссылочным типом, не должны ли они иметь аналогичное сравнение сравнений? Если я хочу использовать массивы, как я могу сделать «содержащий», который работает в моей ситуации?

+0

http://referencesource.microsoft.com/#mscorlib/system/tuple.cs,169 – SLaks

ответ

2

Массивы сравниваются по ссылке, поэтому они не работают.

Кортежи override Equals() для сравнения по значению, поэтому он работает.

+0

Спасибо! Но если я хочу использовать массивы, есть ли элегантный способ сделать это? –

+0

Вы можете сделать свой собственный «EqualityComparer » и передать это. – SLaks

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