3

我正在比较两个不同类型的枚举,但看看它们之间是否有任何区别。我通过将它们都转换为兼容匿名类型的可枚举列表来做到这一点:

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为空,我会得到一个异常。不幸的是,我不能强制这个数组永远为空。似乎没有一种方法可以设置newCombo数组并仍然将两者与 进行比较SequenceEqual,并且将整个事情放在一个if块中以捕获该条件似乎相当混乱。我想要一个单一的、雄辩的 LINQ 语句。

我在想的一件事是这样的:

var newCombo = (from c in plan.Combo ?? new TrainingPlanCombo[0] orderby c.TaskId select new { Id = c.TaskId, Marker = c.Marker });

但是,这似乎有点 hacky。想法?

4

2 回答 2

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
于 2013-05-10T22:40:01.290 回答
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);
于 2013-05-10T22:41:44.487 回答