我需要按对象的一个属性对对象列表进行排序,但它是一个字符串,需要像整数一样进行排序。这些对象是自定义的“属性”对象,其中属性名称(property.Name)是一个字符串,但是90%的属性名称实际上是数字,而其他10%是名称/字母(因此,变量本身必须是字符串,而不是整数)。
我知道我可以用
propertyList.OrderBy(x => x.Name)...but将对它进行排序,就像它是一个字符串一样(例如,15000“大于”20)。
出于排序的目的,我已经将列表划分为两个单独的列表(一个包含属性名包含字母的所有列表,另一个包含可以转换为整数的属性名称),但我不知道如何对“整型”列表进行排序。
我试过了,但它不工作,但有像这样的东西我可以使用吗?
propertyList.OrderBy(x => Convert.ToInt32(x.Name))发布于 2014-11-09 14:07:37
你不需要将数据分成两个列表;还要注意,你可以在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() );发布于 2014-11-09 16:32:14
现在还不清楚你到底想要什么。是否需要原始数据的有序视图?或者,您真的想修改原始数据以使其有序吗?
如果是前者,那么OrderBy()方法就是您想要的。听起来您可以很好地将数字名称与非数字名称分开排序,但在这种情况下,当您尝试第二个代码示例时,并不清楚您所说的“它不工作”是什么意思。该表达式应该可以很好地工作,并提供数据的有序视图。例如。
foreach (var x in propertyList.OrderBy(x => int.Parse(x.Name))
{
// do something with the ordered elements
}如果您的意思是希望实际对原始数据进行排序,那么可以只使用List<T>.Sort()方法:
propertyList.Sort((x, y) => int.Parse(x.Name).CompareTo(int.Parse(y.Name));请注意,在List<T>示例中,从字符串到整型的转换是重复进行的。对于相对较小的集合,这应该不是问题,但如果性能成为问题,那么使用LINQ OrderBy()方法(它为您缓存键)将是首选。您可以结合使用ToList()和OrderBy()将结果物化回List<T>。
当然,这涉及到中间数据结构的开销,所以这样做没有什么意义,除非您有真正的演示性能问题要解决,并且您已经证明了该替代方案解决了该问题。
https://stackoverflow.com/questions/26825473
复制相似问题