Enumerable.Intersect
たとえば、次のように使用できます。
IEnumerable<string> commonSubset = allDevices.First().Interfaces;
foreach (var interfaces in allDevices.Skip(1).Select(d => d.Interfaces))
{
commonSubset = commonSubset.Intersect(interfaces);
if (!commonSubset.Any())
break;
}
DEMO
再利用したい場合は、拡張メソッドにすることができます。
public static IEnumerable<T> CommonSubset<T>(this IEnumerable<IEnumerable<T>> sequences)
{
return CommonSubset(sequences, EqualityComparer<T>.Default);
}
public static IEnumerable<T> CommonSubset<T>(this IEnumerable<IEnumerable<T>> sequences, EqualityComparer<T> comparer)
{
if (sequences == null) throw new ArgumentNullException("sequences");
if (!sequences.Any()) throw new ArgumentException("Sequences must not be empty", "sequences");
IEnumerable<T> commonSubset = sequences.First();
foreach (var sequence in sequences.Skip(1))
{
commonSubset = commonSubset.Intersect(sequence, comparer);
if (!commonSubset.Any())
break;
}
return commonSubset;
}
これで、使用法は非常に簡単になりました (コンペアラーはカスタム型に使用できます)。
var allInterfaces = allDevices.Select(d => d.Interfaces);
var commonInterfaces = allInterfaces.CommonSubset();
Console.Write(string.Join(",", commonInterfaces));