我有一个扩展类,它将Observable集合转换为list并执行order by。这个逻辑工作正常,但我需要它来对字母数字进行排序。 E.g。
代替A1 A10 A2 A3应为A1 A2 A3 A10。
最好的方法是什么?
<pre>
public static void Sort<T>(this ObservableCollection<T> collection, Comparison<T> comparison)
{
var comparer = new Comparer<T>(comparison);
List<T> sorted = collection.OrderBy(x => x, comparer).ToList();
for (int i = 0; i < sorted.Count(); i++)
collection.Move(collection.IndexOf(sorted[i]), i);
}
internal class Comparer<T> : IComparer<T>
{
private readonly Comparison<T> comparison;
public Comparer(Comparison<T> comparison)
{
this.comparison = comparison;
}
#region IComparer<T> Members
public int Compare(T x, T y)
{
return comparison.Invoke(x, y);
}
}
</pre>
答案 0 :(得分:1)
将string
解析为两部分,alpha部分和数字部分。将数字部分放入int
,然后仅在alpha部分为平局时比较int部分。
public int Compare(string left, string right) {
string leftAlpha;
int leftNum;
string rightAlpha;
int rightNum;
GetParts(left, out leftAlpha, out leftNum);
GetParts(right, out rightAlpha, out rightNum);
if (leftAlpha != rightAlpha) {
return String.Compare(leftAlpha, rightAlpha);
}
else {
return leftNum.CompareTo(rightNum);
}
}
private void GetParts(string str, out string alpha, out string num) {
alpha = str.Substring(0, 1);
string numStr = str.Substring(1);
num = Int32.Parse(numStr);
}
如果您可以找到一种方法将这两个部分公开为类的属性,那么最好使用CollectionView进行绑定。 SourceCollection
是ObservableCollection
的位置,然后添加与该类属性相对应的SortDescriptions
。这可能是矫枉过正,但确实有很多好处,比如将新元素直接插入正确的位置。您根本不必明确对集合进行任何排序。