【解決方法】C# のデフォルトの比較子に追加の比較子インターフェイスを追加する


1 人の生徒が次のプロパティを持つ生徒オブジェクトのリストがあるとします。 名前、年齢、会社名 プロパティ。 追加で実装したい インターフェースの比較 これにより、年齢と会社のプロパティを使用して学生のリストを並べ替えることができます。 学生の名前に基づくデフォルトの比較子をすでに実装しています。 名前は辞書順に比較され、学生リストで並べ替えが実行されます。 ここで、年齢や会社名に基づいて学生リストを辞書順に並べ替えることができる追加の並べ替えインターフェイスを実装したいと思います。
C# でそれを行うにはどうすればよいですか?

私が試したこと:

C#
public interface IPerson
{
    string Name { get; set; }
    int Age { get; set; }
    string Company { get; set; }
}
//implementation details for my Student class
public class Student : IPerson, IComparable<Student>  
{
    private string _name;
    private string _company;
    private int _age;   
    public string Name { 
        get => _name;
        set => _name = value; }
    public string Company { get => _company; set => _company= value; 
    
    }
    public int Age { get => _age; set => _age = value; }
    //define the constructor
    public Student(string name, int age, string company)
    {
        _name = name;
        _company = company; 
        _age = age; 
    }
    //the default comparer is name based
    public int CompareTo(Student other)
    {
        return _name.CompareTo(other. Name);    
    }
   //how do I implement additional interfaces for age and company and how do 
   //tell the compiler in Main method to use which type to do it

解決策 1

クラスに比較を実装させるのではなく、実装する外部クラスを使用します。 IComparer<IPerson>

C#
public abstract class PersonComparer : IComparer<IPerson>
{
    public int Compare(IPerson left, IPerson right)
    {
        if (left is null) return right is null ? 0 : -1;
        if (right is null) return 1;
        return CompareCore(left, right);
    }
    
    protected abstract int CompareCore(IPerson left, IPerson right);
}

public class PersonNameComparer : PersonComparer
{
    protected override int CompareCore(IPerson left, IPerson right) => StringComparer.CurrentCulture.Compare(left.Name, right.Name);
}

public class PersonAgeComparer : PersonComparer
{
    protected override int CompareCore(IPerson left, IPerson right) => left.Age.CompareTo(right.Age);
}


public class PersonCompanyComparer : PersonComparer
{
    protected override int CompareCore(IPerson left, IPerson right) => StringComparer.CurrentCulture.Compare(left.Company, right.Company);
}

IComparer インターフェイス (System.Collections.Generic) Microsoft Learn[^]

コメント

タイトルとURLをコピーしました