如何在 c# 中使用允许多种元素位置格式的 OrderBy() 函数?



在我的 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));

仅供参考,OrderByThenBy也以OrderByDescendingThenByDescending的形式出现,因此您不必为简单的降序而否定条件并牺牲可读性。

如果有人知道我是如何解决问题的: 我使用了此处找到的解决方案 当字符串为数字时,如何按字母顺序对字符串进行排序,同时考虑值?

它对我的目的来说效果很好。

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;
}
}
}

最新更新