首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按对象属性对List<>排序

按对象属性对List<>排序
EN

Stack Overflow用户
提问于 2014-11-09 14:00:32
回答 2查看 1.1K关注 0票数 1

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

我知道我可以用

代码语言:javascript
复制
propertyList.OrderBy(x => x.Name)

...but将对它进行排序,就像它是一个字符串一样(例如,15000“大于”20)。

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

我试过了,但它不工作,但有像这样的东西我可以使用吗?

代码语言:javascript
复制
propertyList.OrderBy(x => Convert.ToInt32(x.Name))
EN

回答 2

Stack Overflow用户

发布于 2014-11-09 14:07:37

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

代码语言:javascript
复制
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重载:

代码语言:javascript
复制
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() );
票数 4
EN

Stack Overflow用户

发布于 2014-11-09 16:32:14

现在还不清楚你到底想要什么。是否需要原始数据的有序视图?或者,您真的想修改原始数据以使其有序吗?

如果是前者,那么OrderBy()方法就是您想要的。听起来您可以很好地将数字名称与非数字名称分开排序,但在这种情况下,当您尝试第二个代码示例时,并不清楚您所说的“它不工作”是什么意思。该表达式应该可以很好地工作,并提供数据的有序视图。例如。

代码语言:javascript
复制
foreach (var x in propertyList.OrderBy(x => int.Parse(x.Name))
{
    // do something with the ordered elements
}

如果您的意思是希望实际对原始数据进行排序,那么可以只使用List<T>.Sort()方法:

代码语言:javascript
复制
propertyList.Sort((x, y) => int.Parse(x.Name).CompareTo(int.Parse(y.Name));

请注意,在List<T>示例中,从字符串到整型的转换是重复进行的。对于相对较小的集合,这应该不是问题,但如果性能成为问题,那么使用LINQ OrderBy()方法(它为您缓存键)将是首选。您可以结合使用ToList()OrderBy()将结果物化回List<T>

当然,这涉及到中间数据结构的开销,所以这样做没有什么意义,除非您有真正的演示性能问题要解决,并且您已经证明了该替代方案解决了该问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26825473

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档