c# - 如何在 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));
当然这对我不起作用,任何格式的子步骤总是在最后添加。有没有办法做到这一点而无需完全自己做?
解决方案
如果有人对我如何解决问题感兴趣:我使用了此处找到的解决方案 如何在字符串为数字时按字母顺序对字符串进行排序同时考虑值?
它对我的目的很好。
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;
}
}
}
推荐阅读
- amazon-web-services - 如何在 CLI 中获取 aws lambda 函数名称?
- ejabberd - Ejabberd tsung 测试限制为 1005 个在线用户
- c# - Json.net 关于反序列化更改属性类型和名称
- entity-framework - 如何获取用于特定 DbContext 的“providerName”?
- html - Django:如何在主模板中使用应用程序的视图和表单?
- python-3.x - 问题 /bin/sh: 0: Illegal option -* running code in python3
- html - 为什么使用 td 和 tr 将数千行源代码包装在一个列表中时性能会显着提高?
- c# - 从一个位图中指向另一个数组的多个指针
- javascript - INPUT_GET 不适用于某些字符串?
- javascript - 如何在客户端将数据导出和下载为有效的 xlsx 格式?