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

时间:2015-12-17 11:33:09

标签: 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中完成吗?

5 个答案:

答案 0 :(得分: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都会产生更多的开销,然后对4个属性进行简单的if检查。我肯定会采用简单的属性或方法方法,这种方法简洁明了。不要因为你可以使用它而使用它,因为它是这项工作的最佳工具,而这里显然不是。

答案 1 :(得分:5)

LINQ适用于集合。你没有收藏品,你有四个不同的属性。

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

只需使用普通的旧C#:

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

现在这一点很清楚,当他们阅读时,请向其他读者清楚,并在几个月内阅读时向您表明。

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

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

  • 使用反射获取所有属性
  • 获取所有房产&#39;集合中此实例的值
  • 在此集合中,请致电Distinct()

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

答案 2 :(得分:3)

为了强调@CodeCaster已经提到的有关凌乱的内容,以下内容将是适当的代码:

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)) 
{ 
    /* ... */ 
}

这会通过反射检查您的类型MyClass中的所有属性。然而,一切都比这种方法更好,只是为了完整性而添加它。如果你想要一些稳定的你至少还要证明这个班级是否真的有任何属性。

这仅适用于非索引属性。如果您的财产被编入索引,您还必须证明每个元素都会变得更脏。

现在将它与@Yuval的非常好和短Top == Bottom && Left == Top && Right == Left进行比较。

答案 3 :(得分:2)

我非常喜欢为这样的案例编写一个方法,因为它是可重用的,并且有一个名称可以告诉我们这里发生了什么。

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

然后像这样使用它:

ObjectHelper.AllEqual(Top, Bottom, Left, Right);

答案 4 :(得分:-1)

router-config.json

这可能是另一种解决方法吗?

的Dom