2013-12-10 9 views
-1

Я ищу наиболее эффективный способ кодирования. У меня есть список ints или строк, и мне нужно знать, содержит ли одно из значений в этом списке во второй коллекции.Тест производительности

Если я использую словарь для этой второй коллекции, то я вышел с 5 различными способами поиска:

Dictionary<int, bool> dicSource = new Dictionary<int, bool>(); 
List<int> lstSearch = new List<int>(); 

// First approuce 
var ids = dicSource.Keys.Intersect(lstSearch); 
bool hasMatch1 = ids.Any(); 

//Second approuce 
bool hasMatch2 = dicSource.Any(x => lstSearch.Any(y => y == x.Key)); 

//Third approuce 
bool hasMatch3 = dicSource.Select(x => x.Key).Intersect(lstSearch).Any(); 

//Fourth approuce 
bool hasMatch4 = (dicSource.Where(x => lstSearch.Contains(x.Key)).Count() > 0); 

//Fifth approuce 
for (int i = 0; i < lstSearch.Count; i++) 
{ 
    bool hasMatch5 = dicSource.ContainsKey(lstSearch[i]); 
} 

С другой стороны, я могу использовать другой список для второй коллекции, а затем я вышел с 5 поисковые запросы:

List<int> lst = new List<int>(); 
List<int> lstIds = new List<int>(); 

// First approuce 
var ids = lst.Intersect(lstIds); 
bool hasMatch1 = ids.Any(); 

//Second approuce 
bool hasMatch2 = lst.Any(x => lstIds.Any(y => y == x)); 

//Third approuce 
bool hasMatch3 = lst.Select(x => x).Intersect(lstIds).Any(); 

//Fourth approuce 
bool hasMatch4 = (lst.Where(id => lstIds.Contains(id)).Count() > 0); 

//Fifth approuce 
for (int i = 0; i < lstSearch.Count; i++) 
{ 
    bool hasMatch5 = lstSource.Contains(lstSearch[i]); 
} 

Может кто-нибудь, пожалуйста, скажите мне, что является самым эффективным способом использования здесь?

+5

У вас есть 4 варианта. Большой! Почему бы вам не проверить их самостоятельно? –

+2

См. [Как измерить производительность кода в .NET?] (Http://stackoverflow.com/questions/457605/how-to-measure-code-performance-in-net). – CodeCaster

ответ

1

Чтобы узнать самый быстрый, вы должны выполнить тест производительности.

Но вот еще один вариант для смеси, которая, вероятно, будет быстрее:

var lst = new HashSet<int>(); 
var lstIds = new HashSet<int>(); 

var hasMatch = lst.Intersect(lstIds).Any(); 
+0

Вы устанавливаете обе коллекции как HashSet, я могу установить источник как HashSet, а другой - List. Есть ли способ конвертировать список в HashSet? если это так, стоит ли это? –

+0

У HashSet есть конструктор, который примет существующий список. – Baldrick

+0

Cool. Просто знать, есть ли разница, если я использую 2 HashSets или One HasSet и один список? –

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