Подсчитать количество одинаковых элементов в двух массивах в linq У меня есть 2 строковых массива: A1: {"aa","bb","cc","dd","ee"} A2: {"cc","dd,"ee","bla","blu"} как подсчитать количество одинаковых элементов между A1 и A2 (в данном случае 3)? Ответ 1 Самый короткий, вероятно, будет следующим: A1.Intersect(A2).Count() Ответ 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); Но эти решения также подсчитывают дубликаты, поэтому можно использовать: 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. Ответ 3 int[] id1 = { 44, 26, 92, 30, 71, 38 }; int[] id2 = { 39, 59, 83, 47, 26, 4, 30 }; id1.Intersect(id2).Count(); Ответ 4 Следующий код должен сделать трюк 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" }
Ответ 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); Но эти решения также подсчитывают дубликаты, поэтому можно использовать: 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.
Ответ 3 int[] id1 = { 44, 26, 92, 30, 71, 38 }; int[] id2 = { 39, 59, 83, 47, 26, 4, 30 }; id1.Intersect(id2).Count();
Ответ 4 Следующий код должен сделать трюк 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" }