在我的 wpf 应用程序中,我有一个列表视图,其中包含我想要的元素 能够编写以下格式的位置属性:1,2,3;1a, 1b, 1c;1(a(, 1(b(, 1(c(;1.1, 1.2, 1.3;
这些位置属性是字符串类型,我想按大小和子步骤自动对它们进行排序。
我试过这个:
public class ClassXY
{
public string Position;
}
ObservableCollection<ClassXY> _myCollection = new ...;
_myCollection.OrderBy(p => p.Position);
_myCollection.OrderBy(p => Convert.ToDouble(p.Position));
当然这对我不起作用,任何格式的子步骤总是在最后添加。有没有办法在不完全自己做的情况下做到这一点?
除了需要ThenBy
之外,您还需要记住OrderBy
没有到位,但返回了一个有序的IEnumerable
public class ClassXY
{
public string Position;
}
ObservableCollection<ClassXY> _myCollection = new ...;
var orderedCollection =
myCollection.OrderBy(p => p.Position)
.ThenBy(p => Convert.ToDouble(p.Position));
仅供参考,OrderBy
和ThenBy
也以OrderByDescending
和ThenByDescending
的形式出现,因此您不必为简单的降序而否定条件并牺牲可读性。
如果有人知道我是如何解决问题的: 我使用了此处找到的解决方案 当字符串为数字时,如何按字母顺序对字符串进行排序,同时考虑值?
它对我的目的来说效果很好。
ObservableCollection<ClassXY> _myCollection = new ...;
_myCollection.OrderBy(p => p.Position, new SemiNumericComparer());
public class SemiNumericComparer : IComparer<string>
{
public int Compare(string s1, string s2)
{
if (IsNumeric(s1) && IsNumeric(s2))
{
if (Convert.ToDouble(s1) > Convert.ToDouble(s2)) return 1;
if (Convert.ToDouble(s1) < Convert.ToDouble(s2)) return -1;
if (Convert.ToDouble(s1) == Convert.ToDouble(s2)) return 0;
}
if (IsNumeric(s1) && !IsNumeric(s2)) { return -1; }
if (!IsNumeric(s1) && IsNumeric(s2)) { return 1; }
return string.Compare(s1, s2, true);
}
public static bool IsNumeric(object value)
{
try
{
var i = Convert.ToDouble(value.ToString());
return true;
}
catch (FormatException)
{
return false;
}
}
}