通常在使用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类型。
答案 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::