我有一个简单的类,包含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中完成吗?
您可以将它们插入到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,因为你可以使用它,因为它是工作的最佳工具,在这里显然不是.
LINQ适用于集合.您没有集合,您有四个单独的属性.
你要做的任何事情都要强迫它进入LINQ只会让它变得更加混乱.
只需使用普通的旧C#:
public bool AllPositionsEqual { get { return Top == Bottom && Left == Right && Left == Top; } }
现在这一点很清楚,当他们阅读时会向另一位读者清楚,并在几个月内阅读时向您表明.
如果你要在集合中填充属性只是为了能够在其上调用LINQ方法以确定它们都是相同的,那么你就打破了"最不惊讶的原则".该代码的读者将成为 "WTF".
相反,如果您希望能够在任意类上执行此操作(这也是一个非常令人困惑的要求),您可以这样做:
使用反射获取所有属性
获取集合中此实例的所有属性值
在这个集合上,打电话Distinct()
.
那么你将拥有LINQ的合法用例.现在,你还没有.