2015-12-17 69 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

好點子!接得好 –

相關問題