Если вы можете реализовать сравнение, такое как IComparable<Exam>
(которое может, например, сравнивать на основе ключевого поля, такого как ExamId
), вы можете сделать это следующим образом (показывая пример с использованием целых чисел)
int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
var query = from item1 in array
from item2 in array
where (item1.CompareTo(item2) < 0)
select new Tuple<int, int>(item1, item2);
foreach (Tuple<int, int> tuple in query)
Console.WriteLine("{0}\t{1}", tuple.Item1, tuple.Item2);
Без реализации интерфейса та же логика может быть выражена как Func<>
встроенная или объявлена отдельно, в зависимости от того, насколько сложной может быть логика.
Func<int, int, int> itemComparer = (x, y) => x.CompareTo(y);
// in your case, perhaps
// Func<Exam, Exam, int> examComparer = (exam1, exam2) => exam1.Id.CompareTo(exam2.Id);
var query = from item1 in array
from item2 in array
where itemComparer(item1, item2) < 0
select new Tuple<int, int>(item1, item2);
В противном случае вы можете рассмотретьследуя по указателям и просматривая item2
, только когда его позиция в последовательности превышает item1
.
int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
var query = from item1 in array.Select((item, index) => new { item, index })
from item2 in array.Select((item, index) => new { item, index })
where (item1.index < item2.index)
select new Tuple<int, int>(item1.item, item2.item);
foreach (Tuple<int, int> tuple in query)
Console.WriteLine("{0}\t{1}", tuple.Item1, tuple.Item2);