【发布时间】: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 不会排序。
我错过了什么吗?
【问题讨论】: