Func<T> TResult
既存の LINQ 関数を変更して関数のシグネチャに追加する方法、つまり のようにセレクターを使用できるようにする方法を知りたいと思ってい(o => o.CustomField)
ます。
たとえば、C# では、.IsDistinct()
整数のリストが異なるかどうかを確認するために使用できます。.IsDistinctBy(o => o.SomeField)
フィールド内の整数o.SomeField
が異なるかどうかを確認するために使用することもできます。舞台裏で.IsDistinctBy(...)
、関数シグネチャのようなものがFunc<T> TResult
追加されていると思いますか?
私の質問はこれです: 既存の LINQ 拡張関数を取得し、それを変換してパラメーターを持つことができるようにする手法は何(o => o.SomeField)
ですか?
ここに例があります。
この拡張関数は、リストが単調に増加しているかどうかを確認します (つまり、値が 1,1,2,3,4,5,5 のように減少することはありません)。
main()
{
var MyList = new List<int>() {1,1,2,3,4,5,5};
DebugAssert(MyList.MyIsIncreasingMonotonically() == true);
}
public static bool MyIsIncreasingMonotonically<T>(this List<T> list) where T : IComparable
{
return list.Zip(list.Skip(1), (a, b) => a.CompareTo(b) <= 0).All(b => b);
}
「By」を追加したい場合は、パラメーターを追加しますFunc<T> TResult
。しかし、関数の本体を変更して選択するようにするにはどうすればよい(o => o.SomeField)
ですか?
main()
{
DebugAssert(MyList.MyIsIncreasingMonotonicallyBy(o => o.CustomField) == true);
}
public static bool MyIsIncreasingMonotonicallyBy<T>(this List<T> list, Func<T> TResult) where T : IComparable
{
// Question: How do I modify this function to make it
// select by o => o.CustomField?
return list.Zip(list.Skip(1), (a, b) => a.CompareTo(b) <= 0).All(b => b);
}