LINQ中的自然排序

时间:2018-11-06 13:40:11

标签: c# linq sorting

 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中可以有自然顺序吗?

2 个答案:

答案 0 :(得分:3)

您确定每个Object.Order是一个冒号分隔的字符串,至少包含3个整数值?

为什么不将这三个值转换为整数并按解析后的值排序?

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);

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

答案 1 :(得分:0)

您可以通过实现IComparer来自定义订购行为。请参阅:Microsoft Documentation。也就是说,我更喜欢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;