3

タイプの異なる2つの列挙型を比較していますが、それらの間に違いがあるかどうかを確認しています。これを行うには、両方を互換性のある匿名型の列挙可能なリストにキャストします。

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 の場合は例外が発生します。残念ながら、この配列が null にならないようにすることはできません。空のnewCombo配列に設定し、2つを と比較する方法は実際にはないようです。全体を配置することは、その状態をトラップするブロックであり、かなり面倒です。1 つの雄弁な LINQ ステートメントが必要です。SequenceEqualif

私が考えていたことの1つは、次のようなものです。

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

ただし、これは少しハッキーなようです。アイデア?

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

You can use monads in .net to achieve what you want:

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 に答える