2012-04-11 2 views
11

У меня 2 строковые массивы:подсчет количества одинаковых элементов в двух массивах в LINQ

A1: {"aa","bb","cc","dd","ee"} 
A2: {"cc","dd,"ee","bla","blu"} 

Как подсчитать количество одинаковых элементов между A1 и A2 (в данном случае 3)?

+2

Что вы хотите, если есть дубликаты в одном из массивов? – Dan

+0

Я хочу, чтобы вы считали 1 матч – user560498

ответ

26

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

A1.Intersect(A2).Count() 
+3

Это 3 символов. A1.Count (A2.Contains) :) (я бы все же предпочел ваше решение) – BlueVoodoo

+0

@BlueVoodoo делает подход 'Count Contains' делать правильные вещи при наличии дубликатов? (см. поясняющий комментарий у аськи) – AakashM

+0

@BlueVoodoo, ради интереса, a1.Count (a2.Contains); побеждает с 00: 00: 05.7862636! – ericosg

2

Ниже работает хорошо и может привести к более высокой производительности при использовании списков:

List<string> a1 = new List<string>() { "aa", "bb", "cc", "dd", "ee" }; 
List<string> a2 = new List<string>() { "cc", "dd", "ee", "bla", "blu" }; 

a1.Count(match => a2.Contains(match)); 

или (благодаря @BlueVoodoo) более короткое решение, которое выполняет только немного быстрее:

a1.Count(a2.Contains); 

Но эти решения также дублируют, таким образом, на e может использовать:

HashSet<string> a1 = new HashSet<string>() { "aa", "bb", "cc", "dd", "ee" }; 
HashSet<string> a2 = new HashSet<string>() { "cc", "dd", "ee", "bla", "blu" }; 

Это позволяет избежать дублирования, так как HashSet сохраняет только уникальную последовательность.

После бенчмаркинга выше, HashSet с a1.Count (a2.Contains); обеспечивает самое быстрое решение, даже с накладными расходами на создание HashSet.

+0

Не нужно помещать их в списки, так как вы можете сделать A1.Count (A2.Contains) непосредственно на массивах (я все равно пойду на пересечение Павла). – BlueVoodoo

+0

Ради интереса к, это решение работает быстрее, чем Intersect() ради – ericosg

+0

дальнейшего интереса в некоторых критериях: на 10000000 итераций, Intersect против Linq и лямбды: со списками: 00: 00: 09,9623558 против 00: 00: 06,2140126 с массивами: 00: 00: 09.5918331 vs 00: 00: 48.9175518 Естественно, linq продолжает создавать IEnumerable объекты из массивов, производя накладные расходы, но как только все списки на самом деле быстрее! – ericosg

2
int[] id1 = { 44, 26, 92, 30, 71, 38 }; 
int[] id2 = { 39, 59, 83, 47, 26, 4, 30 }; 

id1.Intersect(id2).Count(); 
1

После кода следует сделать трюк

 var A1 = new[] { "aa", "bb", "cc", "dd", "ee"}; 
     var A2 = new[] { "cc", "dd", "ee", "bla", "blu" }; 

     var query = from one in A1 
        join two in A2 on one equals two 
        select one; 
     var result = query.ToArray();//this should have { "cc", "dd", "ee" } 
Смежные вопросы