c# – 是否可以组合不同类型的委托(使用返回值作为参数)?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 是否可以组合不同类型的委托(使用返回值作为参数)?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3156字,纯文字阅读大概需要5分钟。
内容图文
![c# – 是否可以组合不同类型的委托(使用返回值作为参数)?](/upload/InfoBanner/zyjiaocheng/827/1b17bd061ea4427587db4520cfe54244.jpg)
我有一个集合,我首先需要过滤,然后从中选择一个,但是如何处理集合取决于一些参数.所以我和两位代表一起去了,但不知怎的,我应该把它们结合起来:
delegate IEnumerable<T> FilterDelegate(IEnumerable<T> collection);
delegate T SelectorDelegate(IEnumerable<T> collection, ref T previous);
//Combine above two to this one:
delegate T GetItemDelegate(IEnumerable<T> collection, ref T previous);
我试过这样的东西,但它失败了,因为委托不是匹配的类型:
static GetItemDelegate CreateDelegate(FilterDelegate filter, SelectorDelegate select)
{
return Delegate.Combine(filter, select) as GetItemDelegate;
}
题:
是否可以创建一个新的委托来调用第一个委托并使用返回值作为第二个的输入参数?如果没有ref参数,我可以使用lambdas,但当然我不能使用或参考.
可编辑的例子:
namespace DelegateTest
{
interface INumericValue
{
int Number { get; }
}
class Test : INumericValue
{
public Test(int i)
{
Number = i;
}
public int Number { get; }
}
class Program
{
delegate IEnumerable<T> FilterDelegate<T>(IEnumerable<T> collection) where T : class, INumericValue;
delegate T SelectDelegate<T>(IEnumerable<T> collection, ref T previous) where T : class, INumericValue;
delegate T CombinedDelegate<T>(IEnumerable<T> collection, ref T previous) where T : class, INumericValue;
static void Main()
{
Test previous = new Test(6);
List<Test> collection = new List<Test>();
FilterDelegate<Test> filter = Filter;
SelectDelegate<Test> select = Select;
CombinedDelegate<Test> combined = Delegate.Combine(filter, select) as CombinedDelegate<Test>;
for (int i = 0; i < 10; i++)
collection.Add(new Test(i));
//Expected result Test with Number = 7
Test result = combined(collection, ref previous);
}
static IEnumerable<T> Filter<T>(IEnumerable<T> collection) where T : class, INumericValue
{
return collection.Where(c => c.Number > 3);
}
static T Select<T>(IEnumerable<T> collection, ref T previous) where T : class, INumericValue
{
var previousNumber = previous.Number;
return previous = collection.FirstOrDefault(c => c.Number > previousNumber);
}
}
}
最佳答案:
你可以这样做,但不确定它比链接调用更干净:
class Program {
delegate IEnumerable<T> FilterDelegate<T>(IEnumerable<T> collection) where T : class, INumericValue;
delegate T SelectDelegate<T>(IEnumerable<T> collection, ref T previous) where T : class, INumericValue;
delegate T CombinedDelegate<T>(IEnumerable<T> collection, ref T previous) where T : class, INumericValue;
static void Main() {
Test previous = new Test(6);
List<Test> collection = new List<Test>();
FilterDelegate<Test> filter = Filter;
SelectDelegate<Test> select = Select;
for (int i = 0; i < 10; i++)
collection.Add(new Test(i));
// use explicit types to be able to use ref in lambda
CombinedDelegate<Test> combined = (IEnumerable<Test> c, ref Test p) => @select(filter(c), ref p);
Test result = combined(collection, ref previous);
//Expected result Test with Number = 7
}
static IEnumerable<T> Filter<T>(IEnumerable<T> collection) where T : class, INumericValue {
return collection.Where(c => c.Number > 3);
}
static T Select<T>(IEnumerable<T> collection, ref T previous) where T : class, INumericValue {
// this didn't compile so I changed it.
foreach (var item in collection) {
if (item.Number > previous.Number) {
previous = item;
break;
}
}
return previous;
}
}
内容总结
以上是互联网集市为您收集整理的c# – 是否可以组合不同类型的委托(使用返回值作为参数)?全部内容,希望文章能够帮你解决c# – 是否可以组合不同类型的委托(使用返回值作为参数)?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。