2017-10-14 11 views
0

オブジェクトの複数のプロパティを比較しようとしていますが、コードではdegreeプロパティを比較することしかできません。 Visual Studioでデバッグするとき、私のコードには完全にelse文がないようです。私はどんなヒントもありがとう。結果は1かいないに等しいのいずれかとすることができるので、あなたのコードIComparable CompareTo()、複数のオブジェクトプロパティを比較するにはどうすればよいですか?

if (this.deg.CompareTo(newStudent.deg) == 1) 
{ 
    // do something 
} 
else if (this.deg.CompareTo(newStudent.deg) != 1) 
{ 
    // do something 
} 
else 
{ 
    // do something 
} 

else文で

class Student : IComparable 
{ 
    private string fName; 
    private string lName; 
    private string deg; 
    private int gra; 

    public Student(string firstName, string lastName, string degree, int grade) 
    { 
     fName = firstName; 
     lName = lastName; 
     deg = degree; 
     gra = grade; 
    } 

    public override string ToString() 
    { 
     string var = lName + ", " + fName + " (" + deg + ") Grade: " + gra; 
     return var; 
    } 

    public int CompareTo(object obj) 
    { 
     Student newStudent = obj as Student; 

     if (this.deg.CompareTo(newStudent.deg) == 1) 
     { 
      return 1; 
     } 
     else if (this.deg.CompareTo(newStudent.deg) != 1) 
     { 
      return -1; 
     } 
     else //this is what my code is ignoring and not ordering by firstname as well 
     { 
      if (this.fName == newStudent.fName) 
      { 
       return 0; 
      } 
      else if (this.fName != newStudent.fName) 
      { 
       return -1; 
      } 
      else 
      { 
       return 0; 
      } 
     } 
    } 
} 
+1

を実装することができます度が等しい場合は、すぐに1を返す場合、別の性質によって例えば並べ替えしようとしている場合。それはおそらくあなたが望むものではありません。 –

答えて

0

は、到達することはありません。 あなたは「deg」値だけをチェックしています。彼らはこのように等しい場合たとえば、あなたが確認できます。

public int CompareTo(object obj) 
{ 
    if (obj == null) 
    { 
     return -1; 
    } 
    Student newStudent = obj as Student; 
    // are equal 
    if (deg.CompareTo(newStudent.deg) == 0 && 
     gra.CompareTo(newStudent.gra) == 0 && 
     lName.CompareTo(newStudent.lName) == 0 && 
     fName.CompareTo(newStudent.fName) == 0) 
    { 
     return 0; 
    } 
    else 
    { 
     return 1; 
    } 
} 
0

をあなたはthis.deg.CompareTo(newStudent.deg) == 1場合と-1を返しthis.deg.CompareTo(newStudent.deg) != 1場合は1を返します。比較が1に等しいかそうでないので、残りの部分には決して到達しません。あなたは理由がIComparable and IComparable<T>で説明のために、あなたもIComparable<Student>を実装する必要がありIComparableを実装しようとしている場合は

  • partial class Student : IComparable, IComparable<Student> 
    { 
        public int CompareTo(object obj) 
        { 
         if (obj != null && obj.GetType() != GetType()) 
         { 
          // From https://msdn.microsoft.com/en-us/library/system.icomparable.compareto(v=vs.110).aspx#Remarks 
          // The parameter, obj, must be the same type as the class or value type that implements this interface; otherwise, an ArgumentException is thrown. 
          throw new ArgumentException(string.Format("Object must be of type {0}", GetType())); 
         } 
         return CompareTo((Student)obj); 
        } 
    
        public int CompareTo(Student newStudent) 
        { 
         if (object.ReferenceEquals(this, newStudent)) 
          return 0; 
         else if (newStudent == null) 
          // From https://msdn.microsoft.com/en-us/library/43hc6wht(v=vs.110).aspx#Remarks 
          // By definition, any object compares greater than null, and two null references compare equal to each other. 
          return 1; 
    
         var cmp = this.deg.CompareTo(newStudent.deg); 
         if (cmp != 0) 
          return cmp; 
    
         cmp = this.fName.CompareTo(newStudent.fName); 
         if (cmp != 0) 
          return cmp; 
    
         // Compare additional members as required, return the first nonzero member comparison. 
    
         // Finally return 0 if all member comparisons returned 0. 
         return 0; 
        } 
    } 
    

    注:

    このように、あなたのコードは、次のようになるはずです。

  • IComparableのでIComparable<T>.CompareTo Method (T): Notes to Implementersで述べたように、あなたの比較方法がreflexive, antisymmetric and transitiveであることを確認する必要があり、その値が注文したかをソートすることができます種類によって実装されます。 StudentのメンバーのCompareToメソッドを連続して呼び出し、最初のゼロ以外の値を返すことで、そのようになります。あなたの質問(なぜelse一部が実行されることは決してありません)既に回答されて、へ

1

最初の答えはつまり、1またはnot 1のいずれかである条件のない第三の可能性はありません。

最初に、我々は程度によってソートすると、その後fName によって、我々はIComparer-

class Student : IComparer<Student>{ 

    /* 
    codes 
    */ 


    public int Compare(Student student1, Student student2) 
    { 
      if(student1.deg.Equals(student2.deg)) //if both degrees are same 
      { 
       return string.Compare(student1.fName , student2.fName); // then compare fName 
      } 
      else 
       return string.Compare(student1.deg , student2.deg); 


    } 
} 
関連する問題