2012-09-20 79 views
1

我目前(並在過去一直)使用此循環來查看自定義類的數組,並確保數組中每個類的布爾成員值是相等的。有沒有更好的(更高效,更簡單的代碼)來做到這一點?優化「這種」類型的循環

由於這個解釋非常糟糕,並且缺乏更好的解釋方法,所以我會問:「有沒有更好的方法來優化'這個循環?

//set to true so the loop runs 
boolean AllArentEqual = true; 

while (AllArentEqual){ 
    //do some stuff to make stuff equal   



    ///// Check if stuff is equal ///// 
    //set to false to determine later 
    AllArentEqual = false; 

    //check if any aren't equal 
    for (int i = 1; i < anArrayOfClass.length; i++){ 
     if (anArrayOfClass[i - 1].BooleanValue != anArrayOfClass[i].BooleanValue){ 
      //one isn't equal so set the loop to be re-run 
      AllArentEqual = true; 
     } 
    } 


} //loop until stuff is equal 

回答

1

我會通過提取方法返工了一下,然後可能做這樣的事情:

AttemptMakeEqual(anArrayOfClass); 
while (anArrayOfClass.Any(c => c.BooleanValue != anArrayOfClass[0].BooleanValue)) 
{ 
    AttemptMakeEqual(anArrayOfClass); 
} 


// Extract out a method to: 
void AttemptMakeEqual(YourClass[] values) 
{ 
    //do some stuff to make stuff equal 
} 

如果有機會的話,你可能有「人人平等」的價值觀,而你不知道並不總會需要運行操作第一(即:你的新版本),你可以只是做:

while (anArrayOfClass.Any(c => c.BooleanValue != anArrayOfClass[0].BooleanValue)) 
{ 
    //do some stuff to make stuff equal 
} 
+0

我選擇了這一個,因爲它似乎是最好的解決方案(在整潔方面,看起來),實際工作...... –

2

一個明顯的次要改進是增加了一個的:

for (int i = 1; i < anArrayOfClass.length; i++){ 
    if (anArrayOfClass[i - 1].BooleanValue != anArrayOfClass[i].BooleanValue){ 
     //one isn't equal so set the loop to be re-run 
     AllArentEqual = true; 
     break; // We're done in this round 
    } 
} 

一旦確定並非所有的東西都相同,就沒有必要進一步檢查了。

+0

是,我可以在那裏補充一點,以改善它;然而,我想我正在尋找更多的整體結構改進...... –

+0

結構的改進將取決於如何//做一些東西來使東西平等。除非它很短,否則按照Reed Copsey的建議,按照自己的功能/方法來簡化代碼。當然,如果將它與檢查插入在一起可能會爲加速提供可能性,但如果速度不是問題,我會支持裏德的建議。 –

0

我也許做這樣的事情:

class Widget 
{ 
    public Widget(bool truthiness) 
    { 
    this.Truthiness = truthiness ; 
    } 
    public bool Truthiness { get ; private set ; } 
} 

class FooBar 
{ 
    private Widget[] Widgets { get ; private set; } 

    private Widget[] GetSomeWidgets() 
    { 
     throw new NotImplementedException() ; 
    } 
    public FooBar() 
    { 
    Widgets = GetSomeWidgets() ; 
    } 

    private void WorkOnWidgets() 
    { 
    throw new NotImplementedException() ; 
    } 

    public void MakeEqual() 
    { 
    bool areEqual ; // zero or one widget and it's not a problem 
    while (!(areEqual=CheckIfAllWidgetsEqual())) 
    { 
     WorkOnWidgets() ; 
    } 
    return ; 
    } 

    public bool CheckIfAllWidgetsEqual() 
    { 
    bool value = true ; 
    if (Widgets.Length > 1) 
    { 
     Widget first  = Widgets[0] ; 
     Widget firstUnequal = Widgets.Skip(1).FirstOrDefault(x => x.Truthiness != first.Truthiness) ; 
     value = firstUnequal != null ; 
    } 
    return value ; 
    } 

}