【问题标题】:ListCollectionView with LiveSorting and CustomSort with inheritListCollectionView 与 LiveSorting 和 CustomSort 与继承
【发布时间】:2020-10-29 01:03:29
【问题描述】:

我使用具有自定义排序和实时排序功能的 ListCollectionView(由 wpf TreeView 使用)。 一切正常,直到我想对自定义排序类进行一些继承。

这是工作的 customSort 类

public class NaturalTreeSorter : IComparer
{
    private static readonly Regex m_IntRegex = new Regex(@"(\d+)", RegexOptions.Compiled);

    public int Compare(object x, object y)
    {
        if (x is ITree treeX && y is ITree treeY)
        {
            return Compare(treeX.Name, treeY.Name);
        }
        else
            return 0;
    }

    /// <summary>
    /// Compare 2 string using natural (based on http://www.interact-sw.co.uk/iangblog/2007/12/13/natural-sorting )
    /// </summary>
    /// <param name="x"></param>
    /// <param name="y"></param>
    /// <returns></returns>
    protected int Compare(string x, string y)
    {
        object convert(string str)
        {
            if (int.TryParse(str, out int integer))
                return integer;
            else
                return str;
        }
        var xArray = m_IntRegex.Split(x).Select(convert);
        var yArray = m_IntRegex.Split(y).Select(convert);
        return Compare(xArray, yArray);

    }

    /// <summary>
    /// Compare two sequences of T. (based on http://www.interact-sw.co.uk/iangblog/2007/12/13/natural-sorting )
    /// </summary>
    /// <param name="x">First sequence.</param>
    /// <param name="y">Second sequence.</param>
    protected int Compare<T>(IEnumerable<T> x, IEnumerable<T> y)
    {
        using (IEnumerator<T> leftIt = x.GetEnumerator())
        using (IEnumerator<T> rightIt = y.GetEnumerator())
        {
            while (true)
            {
                bool left = leftIt.MoveNext();
                bool right = rightIt.MoveNext();

                if (!(left || right)) return 0;

                if (!left) return -1;
                if (!right) return 1;

                int itemResult = Comparer<T>.Default.Compare(leftIt.Current, rightIt.Current);
                if (itemResult != 0) return itemResult;
            }
        }
    }
}

但如果我替换为(移动所有内容,除了比较(对象 x,对象 y)):

public class NaturalTreeSorter : NaturalStringSorter, IComparer
{
    public int Compare(object x, object y)
    {
        if (x is ITree treeX && y is ITree treeY)
        {
            return Compare(treeX.Name, treeY.Name);
        }
        else
            return 0;
    }
}

public class NaturalStringSorter : IComparer<string>
{
    private static readonly Regex m_IntRegex = new Regex(@"(\d+)", RegexOptions.Compiled);

    /// <summary>
    /// Compare 2 string using natural (based on http://www.interact-sw.co.uk/iangblog/2007/12/13/natural-sorting )
    /// </summary>
    /// <param name="x"></param>
    /// <param name="y"></param>
    /// <returns></returns>
    protected int Compare(string x, string y)
    {
        object convert(string str)
        {
            if (int.TryParse(str, out int integer))
                return integer;
            else
                return str;
        }
        var xArray = m_IntRegex.Split(x).Select(convert);
        var yArray = m_IntRegex.Split(y).Select(convert);
        return Compare(xArray, yArray);

    }

    /// <summary>
    /// Compare two sequences of T. (based on http://www.interact-sw.co.uk/iangblog/2007/12/13/natural-sorting )
    /// </summary>
    /// <param name="x">First sequence.</param>
    /// <param name="y">Second sequence.</param>
    protected int Compare<T>(IEnumerable<T> x, IEnumerable<T> y)
    {
        using (IEnumerator<T> leftIt = x.GetEnumerator())
        using (IEnumerator<T> rightIt = y.GetEnumerator())
        {
            while (true)
            {
                bool left = leftIt.MoveNext();
                bool right = rightIt.MoveNext();

                if (!(left || right)) return 0;

                if (!left) return -1;
                if (!right) return 1;

                int itemResult = Comparer<T>.Default.Compare(leftIt.Current, rightIt.Current);
                if (itemResult != 0) return itemResult;
            }
        }
    }
}

使用此新代码,当 LiveSortingProperties 中使用的属性发生更改时,ListCollectionView 不会排序。

我错过了什么吗?

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    Compare 方法可能会发生冲突。

    尝试组合而不是继承:

    public class NaturalTreeSorter : IComparer
    {
        private NaturalStringSorter sorter = new NaturalStringSorter();
    
        public int Compare(object x, object y)
        {
            if (x is ITree treeX && y is ITree treeY)
            {
                return sorter.Compare(treeX.Name, treeY.Name);
            }
            else
                return 0;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-11
      • 2012-10-30
      • 1970-01-01
      • 1970-01-01
      • 2012-09-06
      • 2021-03-06
      • 2015-10-16
      相关资源
      最近更新 更多