如何使用缺少元素的Linq进行排序?

时间:2015-12-23 20:10:32

标签: c# linq

通常在使用Linq时,我通常会使用Where或类似过滤掉空/空记录。但是,我需要在多个条件上订购一个列表,并按顺序保留列表中的所有项目。

以下内容仅适用于列表

中所有项目的.Dimension1.Count > 0
var orderedList = mList.Elements
                       .OrderBy(x => x.Property1)
                       .ThenBy(x => x.Property2)
                       .ThenBy(x => x.Property3.Dimension1[0].Value2)
                       .ToList();

如果任何元素都有Dimension1.Count == 0,那么我会收到错误:

  

'指数超出范围。必须是非负数且小于集合的大小。'

由于数组没有标注尺寸,因此可以预期。

当列表包含.Dimension1.Count = 0

的项目时,有没有办法使这项工作成功?

请注意,Dimension1[0].Value2是double类型。

5 个答案:

答案 0 :(得分:5)

您可以这样做:

var orderedList = mList.Elements.OrderBy(x => x.Property1)
.ThenBy(x => x.Property2)
.ThenBy(x => x.Property3.Dimension1.Count == 0
    ? -1
    : x.Property3.Dimension1[0].Value2)
.ToList();

我在这里假设Value2是一个整数。例如,如果是字符串,则可以使用null代替-1

这个想法是当Count为0时使用特殊值。

答案 1 :(得分:1)

您没有提及您是否正在使用,例如,实体框架。令人怀疑这会转换为有效的SQL语句(可能......),但在您的情况下这可能值得一试。

.ThenBy(x => x.Property3.Dimension1[0].Count > 0 ? x.Property3.Dimension1[0].Value2 : -1)

我假设Value2始终为> 0,因此任何记录缺失值都应分配-1,并在列表中进一步推送。如果情况并非如此,您可能需要将-1更改为更适合您情况的内容。

答案 2 :(得分:1)

您只需为第二个ThenBy提供默认值。

.ThenBy(x => x.Property3.Dimension1.Any() 
             ? x.Property3.Dimension1[0].Value2 
             : // Some default value for the type of Value2.
               // Go high or low depending on the type to put 
               // them at the top or bottom of the list
        );

答案 3 :(得分:1)

有一个专门的LINQ方法DefaultIfEmpty,其中

  

返回指定序列的元素或指定的值   如果序列为空,则在单例集合中。

var orderedList = mList.Elements
                       .OrderBy(x => x.Property1)
                       .ThenBy(x => x.Property2)
                       .ThenBy(x => x.Property3.Dimension1.DefaultIfEmpty(someDefaultValue).ElementAt(0).Value2)
                       .ToList();

答案 4 :(得分:0)

如果你想确定Dimensions1数组不会是null异常:

self::