TResult 添加到函数签名?-6ren"> TResult 添加到函数签名?-我非常想知道如何修改现有的 LINQ 函数以添加 Func TResult到函数签名,即允许它使用选择器,如 (o => o.CustomField) . 例如,在 C# 中,我可以使用 .IsDis-6ren">
gpt4 book ai didi

c# - 在 LINQ 中,如何修改现有的 LINQ 扩展方法以添加 "By"选择器,即将 Func TResult 添加到函数签名?

转载 作者:太空狗 更新时间:2023-10-29 23:00:33 28 4
gpt4 key购买 nike

我非常想知道如何修改现有的 LINQ 函数以添加 Func<T> TResult到函数签名,即允许它使用选择器,如 (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);
}

最佳答案

考虑如下实现,它枚举给定的 IEnumerable<T>只有一次。枚举可能会产生副作用,如果可能的话,调用者通常希望进行一次传递。

public static bool IsIncreasingMonotonically<T>(
this IEnumerable<T> _this)
where T : IComparable<T>
{
using (var e = _this.GetEnumerator())
{
if (!e.MoveNext())
return true;
T prev = e.Current;
while (e.MoveNext())
{
if (prev.CompareTo(e.Current) > 0)
return false;
prev = e.Current;
}
return true;
}
}

你的 enumerable.IsIncreasingMonotonicallyBy(x => x.MyProperty)您描述的重载现在可以写成如下。

public static bool IsIncreasingMonotonicallyBy<T, TKey>(
this IEnumerable<T> _this,
Func<T, TKey> keySelector)
where TKey : IComparable<TKey>
{
return _this.Select(keySelector).IsIncreasingMonotonically();
}

关于c# - 在 LINQ 中,如何修改现有的 LINQ 扩展方法以添加 "By"选择器,即将 Func<T> TResult 添加到函数签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14861039/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com