c# - List<> 按对象属性排序

标签 c# .net list object

我需要根据对象的属性之一对对象列表进行排序,但它是一个字符串,需要像整数一样进行排序。这些对象是自定义“属性”对象,其中属性名称 (property.Name) 是一个字符串,但是 90% 的属性名称实际上是数字,而另外 10% 是名称/字母(因此变量本身必须是字符串而不是整数)。

我知道我可以用

propertyList.OrderBy(x => x.Name)

...但这会将它排序为字符串(即 15000“大于”20)。

出于排序目的,我已经将列表分成两个单独的列表(一个包含所有属性名称包含字母的列表,另一个包含可以转换为整数的列表),但我没有知道如何对“整数”列表进行排序。

我已经试过了,但它不起作用,但有没有类似的东西我可以使用?

propertyList.OrderBy(x => Convert.ToInt32(x.Name))

最佳答案

您不需要将数据分成两个列表;另请注意,您可以在 lambda 方法中执行复杂的操作,您只需要使用不同的语法:

IEnumerable<TItem> sorted = propertyList.OrderBy( x => {
    Int32 asInt;
    if( Int32.TryParse( x.Name, NumberStyles.Integer, CultureInfo.InvariantCulture, out asInt ) ) {
        return asInt;
    }
    if( x.Name.Length > 0 ) return (Int32)x.Name[0];
    return 0;
});

请注意,此代码有点丑陋且不完善,因为如果两个文本名称以相同的字符开头,它将无法正确排序。我建议改用更高级的 OrderBy 重载:

class NameComparer : IComparer<String> {
    public Int32 Compare(String x, String y) {
        // put Name comparison logic here
    }
}

IEnumerable<TItem> sorted = propertyList.OrderBy( x => x.Name, new NameComparer() );

关于c# - List<> 按对象属性排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26825473/

相关文章:

Python list.append 之后更改元素

c# - 是否有用于重新格式化 C# 代码的工具?

c# - 无法调试 VSIX 项目

c# - 调用 Facebook/Google+ 时 ExternalLogin 未命中

.net - 查询中的 Entity Framework 空值

python - 新人解析tweet json 报错UnicodeEncodeError : 'charmap' codec can't encode characters in position 13-63: character maps to <undefined>

c# - 将 C# 对象验证为 XSD 并生成 xml 输出

c# - 关闭后如何使 Window.Current 可见?

c# - .net 接口(interface)与泛型方法,实现中的错误

c# - 如何在 C# 中将 FSharpList 转换回 List?