Самый простой способ - создать комбинированный ключ, например, в ответе Ану.Другой способ сделать это (не обязательно лучший, но избегающий вложенных коллекций и объединения строк):
var groups = transactions.GroupBy(t=> t.Debitor.CompareTo(t.Creditor) > 0 ? (t.Debitor,t.Creditor) : (t.Creditor,t.Debitor));
NB. Выше предполагается, что вы можете использовать неявное создание кортежей.Если у вас более низкая версия C # и / или у вас не установлен пакет ValueTuple NuGet, вы можете использовать: var groups = transactions.GroupBy(t=> t.Debitor.CompareTo(t.Creditor) > 0 ? Tuple.Create(t.Debitor,t.Creditor) : Tuple.Create(t.Creditor,t.Debitor));
Чисто для упоминания этого, другой способ - использоватьпользовательский компаратор равенства для группы по.Это может быть излишним в зависимости от ваших потребностей, размера коллекции, необходимости повторного использования и т. Д., Но для демонстрации возможности все же: сначала создайте класс (или реализуйте его в транзакции напрямую)
class TransactionDebCredComparer : EqualityComparer<Transaction>
{
public override bool Equals(Transaction t1, Transaction t2) => (t1.Debitor == t2.Creditor && t2.Debitor == t1.Creditor) || (t1.Debitor == t2.Debitor && t2.Creditor == t1.Creditor);
public override int GetHashCode(Transaction t) => t.Debitor.GetHashCode() ^ t.Creditor.GetHashCode();
}
Затем выможете сгруппировать ваш перечислимый используя
var groups = transactions.GroupBy(t=>t, new TransactionDebCredComparer() );