【问题标题】:operators in c# for Func<in T, bool>用于 Func<in T, bool> 的 c# 中的运算符
【发布时间】:2014-08-07 11:11:55
【问题描述】:

我需要比较两个相同类型的实例。

public class Person
{
    public int Age {get;set;}
    public string Name { get;set;}

    public static bool operator < (Person p1, Person p2)
    {
         return p1.Age < p2.Age; 
    }
    public static bool operator > (Person p1, Person p2)
    {
         return p1.Age > p2.Age;
    }
}

现在在 Main 我有代码:

Person o = new Person()
{
    Age = 10,
    Name = "Matin"
};
Func<Person, bool> test = person => person < o;
Person o2 = new Person()
{
    Age = 9,
    Name = "hehe"
};

Console.WriteLine(test(o2));

输出:真; 在我看来,第一个人大于第二个人。你能解释一下这种情况吗?

【问题讨论】:

  • 这正是您的代码所说的 - 第一个人大于第二个人?您的 func 正在测试当前人 (o2) 是否小于第一人 (o)。所以你得到了准确的回应。
  • @KamilT 测试是 Func (lambda)
  • o 在第二位,所以是正确的。你想要p =&gt; o &lt; p
  • 你需要第一个人大于第二个,输出说第二个小于o(1st)。两者都是一样的。

标签: c# operators


【解决方案1】:

您的代码:

Func<Person, bool> test = person => person < o;

因此,您正在传递此人并将其与第一个 (o) 进行比较。

test(o2)

转化为

evaluate `o2 < o`

这是真的,如o2.Age &lt; o.Age (9

【讨论】:

    【解决方案2】:

    你应该像这样实现 IComparable:

    public class Person : IComparable<Person>
    {
        public int Age { get; set; }
        public string Name { get; set; }
    
        public int CompareTo(Person other)
        {
            return this.Age.CompareTo(other.Age);
        }
    }
    

    并像这样使用它:

    Person o = new Person()
    {
        Age = 10,
        Name = "Matin"
    };
    Person o2 = new Person()
    {
        Age = 9,
        Name = "hehe"
    }
    
    Console.WriteLine(o.CompareTo(o2));
    

    【讨论】:

      【解决方案3】:

      你的测试是:

      传递给函数的人必须小于o

      在这种情况下,“小于”表示“年龄小于”。

      那你传入o2,让我们看看:

      • o2,9 岁
      • o,10 岁

      所以是的,o2 小于 o

      输出正确。

      【讨论】:

        【解决方案4】:

        在对test(o2)的调用中,对象o2作为参数person传递给test。 这样,表达式o2 &lt; o 被求值,得到true,因为o2 的年龄是9,o 的年龄是10。

        【讨论】:

          【解决方案5】:

          输出为真,因为正是您的代码所说的。

          要进行良好的比较,您需要两个变量(目前,您一直在使用“o”实例进行比较)

          Func&lt;Person, Person, bool&gt; test = (person1, person2) =&gt; person1 &lt; person2;

          然后Console.WriteLine(test(o, o2));

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多