使用LINQ比较两个序列的差异

时间:2013-05-10 22:31:45

标签: c# .net linq

我正在比较两种不同类型的枚举,但看看它们之间是否存在任何差异。我通过将它们都转换为兼容的匿名类型的可枚举列表来实现这一点:

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

然而,这看起来有点哈哈。想法?

2 个答案:

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