LINQ中的自然排序


SortedList = List.OrderBy(object1=> object1.Order.Split(';')[0])
.ThenBy(object2=> object2.Order.Split(';')[1])
.ThenBy(object3=> object3.Order.Split(';')[2])
.ToList();

订单的值为1;1.1.我在";"处拆分并对元素进行排序。但我得到了一个"字母顺序"。这意味着1,10,2,3。无法将字符串格式设置为4位,因为对象不是字符串。LINQ中的自然秩序可能吗?

您确定每个Object.Order都是至少有3个整数值的冒号分隔字符串吗?

为什么不将这三个值转换为integer并根据解析的值进行排序?

var result = myInputSequence.Select(sourceItem => new
{
SplitOrderNumbers = (sourceItem.Order.Split(';')
.Select(splitItem => Int32.Parse(splitItem))
.Take(3)
.ToList(),
OriginalSourceItem = sourceItem,
})
.OrderBy(item => item.SplitOrderNumbers[0])
.ThenBy(item => item.SplitOrderNumbers[1])
.ThenBy(item => item.SplitOrderNumbers[2])
.Select(item => item.OriginalSourceItem);

加分:与您的解决方案不同,您只能拆分一次订单。

您可以通过实现IComparer来根据需要定制订购行为。请参阅:Microsoft文档。也就是说,我更喜欢Harald Coppoolse的回答。事实上,我非常喜欢他的答案,我也喜欢linq语法:

var result = from n in myInputSequence
let split = n.Order.Split(';').
Select(splitItem => Int32.Parse(splitItem)).
Take(3).ToList()
orderby split[0], split[1], split[2]
select n;

最新更新