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
4

3 に答える 3

2

明らかなマイナーな改善は、break:の追加です。

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

すべてが等しいわけではないことが確認されたら、さらにチェックする意味はありません。

于 2012-09-20T22:34:34.193 に答える
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  
}
于 2012-09-20T22:34:19.310 に答える
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 ;
  }

}
于 2012-09-21T00:03:10.037 に答える