当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《查找类中的所有属性是否相同》经验,为你挑选了2个好方法。

我有一个简单的类,包含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中完成吗?



1> Yuval Itzcha..:

您可以将它们插入到HashSet:

var doubles = new HashSet { Top, Left, Right, Bottom };
if (doubles.Count == 1)
{
    // Do stuff
}

或使用Enumerable.Distinct:

var doubles = new[] { Top, Bottom, Left, Right };
if (doubles.Distinct().Count() == 1)
{
    // Do stuff
}

但也许最简单的方法是创建一个方法(或者一个属性,如果你喜欢它):

public class MyClass
{
    public bool AreAllPropertiesSame()
    {
        return Top == Bottom && Left == Top && Right == Left;
    }
}

注意任何使用LINQ都会产生更多的开销,然后只需if检查4个属性.我肯定会采用简单的属性或方法方法,这种方法简洁明了.不要遵循LINQ,因为你可以使用它,因为它是工作的最佳工具,在这里显然不是.



2> CodeCaster..:

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

你要做的任何事情都要强迫它进入LINQ只会让它变得更加混乱.

只需使用普通的旧C#:

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

现在这一点很清楚,当他们阅读时会向另一位读者清楚,并在几个月内阅读时向您表明.

如果你要在集合中填充属性只是为了能够在其上调用LINQ方法以确定它们都是相同的,那么你打破了"最不惊讶的原则".该代码的读者将成为 "WTF".

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

使用反射获取所有属性

获取集合中此实例的所有属性值

在这个集合上,打电话Distinct().

那么你将拥有LINQ的合法用例.现在,你还没有.

推荐阅读
Chloemw
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有