我正在比较两种不同类型的枚举,但看看它们之间是否存在任何差异。我通过将它们都转换为兼容的匿名类型的可枚举列表来实现这一点:
var curCombo = (from c in curPlan.TPM_TRAININGPLANSOLUTIONS orderby c.TASKID select new { Id = c.TASKID, Marker = c.ISMARKERCOMPLETION });
var newCombo = (from c in plan.Combo orderby c.TaskId select new { Id = c.TaskId, Marker = c.Marker });
然后看看序列是否相同:
bool equals = curCombo.SequenceEqual(newCombo);
这很有效,但是如果plan.Combo
为空,我会得到一个例外。不幸的是,我不能强迫这个数组永远不为null。似乎没有办法将newCombo
设置为空数组,并仍将两者与SequenceEqual
进行比较,并将整个事件设为{{1}阻止陷入这种情况似乎相当混乱。我想要一个雄辩的LINQ语句。
我想的一件事就是这样:
if
然而,这看起来有点哈哈。想法?
答案 0 :(得分:3)
也许你想写一个像这样的扩展方法
public static IEnumerable<T> AssureNotNull<T>(this IEnumerable<T> list)
{
if (list == null) return Enumerable.Empty<T>();
return list;
}
修改强>
用法是:
List<int> nullList = null;
var sum = nullList.AssureNotNull().Sum(); //will be 0
答案 1 :(得分:0)
您可以在.net中使用monads来实现您的目标:
var newCombo = plan.With(p=>p.Combo.OrderBy(c=>c.TaskId)
.Select(c=>new { Id = c.TaskId, Marker = c.Marker }));
bool equals = newCombo.Returns(n=>n.SequenceEqual(curCombo), false);