:
1. Performs all `AND`s
2. Perform all `OR`s
.
a & b & c | d | e & f & g | h ==
(a & b & c) | (d) | (e & f & g) | (h) ==
a_b_c | d | e_f_g | h ==
final result
{19, 23, 29} & {1, 4, 29} | {1, 5, 23} & {2, 4, 19} ==
({19, 23, 29} & {1, 4, 29}) | ({1, 5, 23} & {2, 4, 19}) ==
{29} | {} ==
{29}
private static IEnumerable<T> CombinatorOrAnd<T>(IEnumerable<IEnumerable<T>> sources,
IEnumerable<string> actions) {
List<IEnumerable<T>> orList = new List<IEnumerable<T>>();
bool isFirst = true;
IEnumerable<T> temp = null;
using (var en = actions.GetEnumerator()) {
foreach (var argument in sources) {
if (isFirst) {
temp = argument;
isFirst = false;
continue;
}
en.MoveNext();
if (en.Current == "AND")
temp = temp.Intersect(argument);
else {
orList.Add(temp);
temp = argument;
}
}
}
orList.Add(temp);
return orList.Aggregate((s, a) => s.Union(a));
}
List<int> list1 = new List<int>(new int[] { 19, 23, 29 });
List<int> list2 = new List<int>(new int[] { 1, 4, 29 });
List<int> list3 = new List<int>(new int[] { 1, 5, 23 });
List<int> list4 = new List<int>(new int[] { 2, 4, 19 });
List<string> andOrList = new List<string>();
andOrList.Add("AND");
andOrList.Add("OR");
andOrList.Add("AND");
var result = CombinatorOrAnd(new List<int>[] { list1, list2, list3, list4}, andOrList);
Console.Write(string.Join(", ", result.OrderBy(item => item)));
29