2015-12-17 30 views
1

我有一个包含这样发现如果一个类中的所有属性都一样

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;} 
} 

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

+2

为什么“做你想做的事情”是混乱的?任何其他解决方案,特别是添加LINQ时,只会变得更加混乱。 – CodeCaster

回答

5

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

任何你要做的强制LINQ的东西只会让它变得更加混乱。

只需使用普通的老C#:

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

,当你在几个月读它这是现在很清楚你,清楚,当他们读它另一位读者,并且清楚你。

如果你打算在一个集合中填充属性,只是为了能够调用它的LINQ方法来确定它们都是相同的,那么打破了“最少惊讶原则”。该代码的读者将去“WTF”。

相反,如果你希望能够做到这一点上的任意类(这也将是一个非常令人困惑的要求),你能做到这样:

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

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

5

你可以将它们插入到一个HashSet<double>

var doubles = new HashSet<double> { 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将产生更多的开销,然后d对4个属性进行简单的if检查。我肯定会用简单的财产或方法来清楚简洁。不要因为可以使用LINQ而使用它,因为它是工作的最佳工具,在这里显然不是。

3

为了强调已经提到什么@CodeCaster关于messyness以下将针对相应的代码:你的反射MyClass类型中

var properties = typeof(MyClass).GetProperties(); 
var first = proerties[0].GetValue(myInstance, null); 
if (properties.Select(x => x.GetValue(myInstance, null)).All(x => x.Equals(first)) 
{ 
    /* ... */ 
} 

此检查的所有属性。然而,一切都比这种方法更好,只是为了完整性而添加它。如果你想要一些稳定的话,你至少必须证明这个类是否有任何属性。

这仅适用于非索引属性。如果你的财产被索引,你也必须证明每个元素也变得更加肮脏。

现在,将此与来自@Yuval的非常不错和短小的Top == Bottom && Left == Top && Right == Left进行比较。

+0

@CodeCaster Yeap,updated – HimBromBeere

+1

ToList是多余的,可以省略,因为[GetProperties](https://msdn.microsoft.com/de-de/library/kyaxdd3x(v = vs.110).aspx)返回一个' PropertyInfo []' – CSharpie

+0

@CSharpie哦,的确,你是对的 – HimBromBeere

2

我真的很喜欢为这种情况编写一个方法,因为它是可重用的,并且有一个名字来说明这里发生了什么。

public static bool AllEqual<T>(T frist, params T[] values) 
{ 
    return values.All(v => Equal(first,v)); 
} 

,然后用它是这样的:

ObjectHelper.AllEqual(Top, Bottom, Left, Right); 
-1
bool b = (Top == (new double[] { Top, Bottom, Left, Right }).Average()); 

这可能是一个替代的解决方法?

大教堂

+1

这不是真的,如果'Top = 1,Bottom = -1 Left = 2,Right = 2'平均数将为1,这就等于Top .... – CSharpie

+0

好点子!接得好 –

相关问题