File: System\Windows\Forms\Design\MaskDescriptorComparer.cs
Web Access
Project: src\src\System.Windows.Forms.Design\src\System.Windows.Forms.Design.csproj (System.Windows.Forms.Design)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
namespace System.Windows.Forms.Design;
 
/// <summary>
/// Implements the manual sorting of items by columns in the mask descriptor table.
/// Used by the MaskDesignerDialog to sort the items in the mask descriptors list.
/// </summary>
internal class MaskDescriptorComparer : IComparer<MaskDescriptor>
{
    private readonly SortOrder _sortOrder;
    private readonly SortType _sortType;
 
    public enum SortType
    {
        ByName,
        BySample,
        ByValidatingTypeName
    }
 
    public MaskDescriptorComparer(SortType sortType, SortOrder sortOrder)
    {
        _sortType = sortType;
        _sortOrder = sortOrder;
    }
 
    public int Compare(MaskDescriptor? maskDescriptorA, MaskDescriptor? maskDescriptorB)
    {
        if (maskDescriptorA is null || maskDescriptorB is null)
        {
            // Since this is an internal class we cannot throw here, the user cannot do anything about this.
            Debug.Fail("One or more parameters invalid");
            return 0;
        }
 
        string? textA;
        string? textB;
 
        switch (_sortType)
        {
            default:
                Debug.Fail("Invalid SortType, defaulting to SortType.ByName");
                goto case SortType.ByName;
 
            case SortType.ByName:
                textA = maskDescriptorA.Name;
                textB = maskDescriptorB.Name;
                break;
 
            case SortType.BySample:
                textA = maskDescriptorA.Sample;
                textB = maskDescriptorB.Sample;
                break;
 
            case SortType.ByValidatingTypeName:
                textA = maskDescriptorA.ValidatingType is null ? SR.MaskDescriptorValidatingTypeNone : maskDescriptorA.ValidatingType.Name;
                textB = maskDescriptorB.ValidatingType is null ? SR.MaskDescriptorValidatingTypeNone : maskDescriptorB.ValidatingType.Name;
                break;
        }
 
        int retVal = string.Compare(textA, textB, StringComparison.CurrentCulture);
 
        return _sortOrder == SortOrder.Descending ? -retVal : retVal;
    }
 
    public static int GetHashCode(MaskDescriptor maskDescriptor)
    {
        if (maskDescriptor is not null)
        {
            return maskDescriptor.GetHashCode();
        }
 
        Debug.Fail("Null maskDescriptor passed.");
        return 0;
    }
 
    public static bool Equals(MaskDescriptor? maskDescriptorA, MaskDescriptor? maskDescriptorB)
    {
        if (!MaskDescriptor.IsValidMaskDescriptor(maskDescriptorA) || !MaskDescriptor.IsValidMaskDescriptor(maskDescriptorB))
        {
            return maskDescriptorA == maskDescriptorB; // shallow comparison.
        }
 
        return maskDescriptorA.Equals(maskDescriptorB);
    }
}