c# - 查找类中的所有属性是否相同

标签 c# linq

我有一个简单的类,其中包含 4 个像这样的双属性

 public MyClass
 {
     public MyClass(double all = 0)
     {
         Top = Bottom = Left = Right = all;
     }
     public MyClass(double lr = 0, double tb = 0)
     {
         Top = Bottom = tb;
         Left = Right = lr;
     }
     public MyClass(double l = 0, double r = 0, double t = 0, double b = 0)
     {
         Top = t;Bottom = b;Left = l;Right = r;
     }

     public double Top {get; private set;}
     public double Bottom {get; private set;}
     public double Left {get; private set;}
     public double Right {get; private set;}
}

是否有一种简单的方法来检查所有属性是否具有相同的值?我宁愿不使用 if (Top == Bottom) && (Top == Left) ... 因为恕我直言,它有点乱。可以在 LINQ 中完成吗?

最佳答案

LINQ 适用于集合。您没有集合,您有四个独立的属性。

任何将其强加到 LINQ 中的操作只会使它变得更加困惑。

只需使用普通的旧 C#:

public bool AllPositionsEqual
{
    get
    {
        return Top == Bottom 
            && Left == Right
            && Left == Top;
    }
}

这对你来说很清楚,当其他读者阅读它时对他们来说很清楚,当你在几个月后阅读它时对你也很清楚。

如果您要将属性填充到集合中只是为了能够对其调用 LINQ 方法以确定它们是否相同,那么您违反了“原则”最少的惊讶”。该代码的读者“WTF”。

相反,如果您希望能够在任意类上执行此操作(这也是一个非常令人困惑的要求),您可以这样做:

  • 使用反射获取所有属性
  • 获取集合中此实例的所有属性值
  • 在此集合上,调用 Distinct()

然后您将拥有 LINQ 的合法用例。现在,你还没有。

关于c# - 查找类中的所有属性是否相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34333548/

相关文章:

c# - 如何使用 EF6 更新多对多表

c# - WPF、C#、SQL - 在数据库中创建行

c# - LINQ to SQL - 如何高效地对多个条件执行 AND 或 OR 搜索

linq - 有没有办法使用Linq到Oracle

c# - 如何从内存列表中获取一组不同的属性值?

c# - 如何在当前版本的 Roslyn 中获取 SyntaxToken.Kind?

c# - 从 int[] 转换为 int*

c# - 通过 CaSTLe Windsor 中的属性注入(inject)进行循环依赖

c# - 优化Entity框架Query,避免延迟加载

c# - 为什么这个有效但另一个失败(Linq To Xml)