Каков синтаксис лямбда-выражения, сравнивающего два элемента из одного набора? - PullRequest
0 голосов
/ 28 декабря 2018

Я пытаюсь использовать лямбда-выражение для сравнения каждого элемента в хэш-наборе со всеми остальными.

Вот пример того, что я пытаюсь сделать.У меня есть класс типа Implication.Импликация имеет два свойства - предшествующее и последующее.Если один подтекст говорит, что A подразумевает B, а другой говорит, что B подразумевает C, тогда существует транзитивная связь.Другими словами, A подразумевает C. Вот упрощенная версия моего кода.

Я пытаюсь использовать лямбда-выражение, чтобы найти все объекты Implication в хэш-наборе, которые имеют транзитивные отношения.В последней строке кода в этом классе я использую предложение Where для выполнения запроса.Но я получаю сообщение об ошибке.По некоторым причинам он ожидает, что мой второй параметр (otherImplication) будет иметь тип int вместо Implication.Но первый параметр интерпретируется правильно.Как мне определить тип второго параметра?

public class Implication
{
    public int antecedent  { get; set; }
    public int consequent  { get; set; }

    public Implication(int antecedent, int consequent)
    {
        this.antecedent  = antecedent;
        this.consequent  = consequent;
    }

    public static void Test()
    {
        HashSet<Implication> hashset = new HashSet<Implication>();
        hashset.Add(new Implication(1, 2));  //transitive
        hashset.Add(new Implication(2, 3));  //transitive
        hashset.Add(new Implication(3, 4));  //transitive
        hashset.Add(new Implication(5, 6));  //NOT transitive
        hashset.Add(new Implication(7, 8));  //NOT transitive

        var transitives = hashset.Where((implication, otherimplication) => implication.antecedent  == otherimplication.consequent);

        // I'm getting the following error message for 
        // 'otherimplication.consequent' at the end of the previous line.

        // Error CS1061  'int' does not contain a definition for 
        // 'consequent' and no extension method 'consequent' 
        // accepting a first argument of type 'int' could be 
        // found(are you missing a using directive or an 
        // assembly reference ?)    

    }
}

Спасибо за помощь.

1 Ответ

0 голосов
/ 28 декабря 2018

Попробуйте это:

    var antecedents = hashset.ToLookup(x => x.antecedent);
    var consequents = hashset.ToLookup(x => x.consequent);

    var transitives =
        hashset
            .Where(x =>
                antecedents[x.consequent]
                    .Concat(consequents[x.antecedent])
                    .Any());

Это дает мне (1, 2), (2, 3), (3, 4).

...