Вы можете использовать это обобщенное расширение, которое я написал для другой ответ , это по сути один оператор Linq.Обратите внимание, что он использует Zip
, чтобы избежать ненужного полного перечисления совпадающих групп.
public static IEnumerable<T> Commom<T>(
this IEnumerable<T> source,
IEnumerable<T> sequence,
IEqualityComparer<T> comparer = null)
{
if (sequence == null)
{
return Enumerable.Empty<T>();
}
if (comparer == null)
{
comparer = EqualityComparer<T>.Default;
}
return source.GroupBy(t => t, comparer)
.Join(
sequence.GroupBy(t => t, comparer),
g => g.Key,
g => g.Key,
(lg, rg) => lg.Zip(rg, (l, r) => l),
comparer)
.SelectMany(g => g);
}
это позволяет,
new[] {1, 2, 2, 2, 3, 3, 4, 5}.Common(
new[] {1, 1, 2, 2, 3, 3, 3, 4, 4}).ToArray()
поддерживать порядок исходной последовательности, как требуется.