您似乎故意将您的数字左对齐索引,这意味着从 1 到 12 的升序字符串排序序列将是1, 11, 12, 2, 3, 4, ...
由于您在创建字符串期间拥有索引值,因此再次从字符串中解析出数字以对其进行排序是很浪费的。最好将索引和字符串分别保留在合适的数据结构中,按索引排序,然后只投影出字符串。
更新了 OP 的新问题
IComparable每次您需要按其属性之一对相关数据的可枚举进行排序时,创建自定义 POCO 类(有或没有实现)似乎都是多余的。
相反,您可以轻松构建包含可排序整数和连接字符串的可排序匿名类、结构或元组,然后排序,然后仅投影字符串。无论哪种方式,OP 的GetPropertyValue方法似乎都返回(反映)弱类型,例如objector string- 接受的答案不会编译,因为它需要将索引转换为int.
这是值元组解决方案:
var tuples = new List<(int index, string str)>();
foreach (ManagementObject disk in objectSearcher.Get() )
{
var indexValue = int.Parse(disk.GetPropertyValue("Index"));
tuples.Add((indexValue, string.Format("{0, -15} {1,-35} {2, -20}",
indexValue,
disk.GetPropertyValue("Model"),
diskSize)));
}
// Sort by index, and project out the assembled string.
var myList = tuples
.OrderBy(t => t.index)
.Select(t => t.str)
.ToList();
原始答案,OP有一个简单的循环
我在下面所做的是保留原始字符串的 Value 元组,以及前 15 位的解析整数值。
请注意,如果字符串的前 15 个字符中有非数字字符,这将中断。
// Test Data
var strings = Enumerable.Range(0, 12)
.Select(i => (string.Format("{0, -15} {1,-35} {2, -20}", i, "Model", "35GB")));
// Project out a tuple of (index, string)
var indexedTuples = strings.Select(s => (idx: int.Parse(s.Substring(0, 15)), str: s));
var sorted = indexedTuples.OrderBy(t => t.idx)
.Select(t => t.str);