标签: func

在C#中作为Func操作

我有一个参数方法,它Func作为一个参数

SomeType SomeMethod<T>( Func<T, T> f ) {...}
Run Code Online (Sandbox Code Playgroud)

我想传递一个,Action而不必重载该方法.但是这就解决了这个问题,你如何代表和Action作为一个Func?我试过了

Func<void, void>
Run Code Online (Sandbox Code Playgroud)

但它无效.

c# lambda action func

12
推荐指数
2
解决办法
1361
查看次数

封装Action <T>和Func <T>?

我正在尝试为某种IExecutable接口进行设计.我不会详细介绍,但重点是我有几个需要从基类执行的动作.它们可能采用不同的参数(没什么大不了的),它们可能/可能不会返回值.

到目前为止,这是我的设计:

public abstract class ActionBase
{
    // ... snip ...
}

public abstract class ActionWithResultBase<T>: ActionBase
{
    public abstract T Execute();
}

public abstract class ActionWithoutResultBase: ActionBase
{
    public abstract void Execute();
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,我的每个具体动作都需要来自ActionWithResultBase或ActionWithoutResult基础的孩子,但我真的不喜欢这样.如果我可以将Execute的定义移动到ActionBase,考虑到具体类可能会或可能不会返回值,我将实现我的目标.

有人告诉我这可以通过使用Func和Action完成,我完全同意,但是我找不到将其转换为单个类的方法,以便调用者知道操作是否将返回值或不.

简介:我想做的事情如下:

// Action1.Execute() returns something.
var a = new Action1();
var result = a.Execute();

// Action2.Execute() returns nothing.
var b = new Action2();
b.Execute();
Run Code Online (Sandbox Code Playgroud)

c# parameters action overloading func

11
推荐指数
1
解决办法
3580
查看次数

即使签名匹配,也无法将一种类型的委托分配给另一种类型

我的病态好奇让我想知道为什么以下失败:

// declared somewhere
public delegate int BinaryOperation(int a, int b);

// ... in a method body
Func<int, int, int> addThem = (x, y) => x + y;

BinaryOperation b1 = addThem; // doesn't compile, and casting doesn't compile
BinaryOperation b2 = (x, y) => x + y; // compiles!
Run Code Online (Sandbox Code Playgroud)

c# lambda delegates type-conversion func

11
推荐指数
2
解决办法
3963
查看次数

使用带有不返回值的闭包的LINQ的Zip

免责声明:这个问题是由我个人的好奇心推动而不是实际需要完成的事情.所以我的例子将会做作.尽管如此,我认为这个问题很可能会突然出现.

假设我们正在使用Zip迭代两个序列,调用一个void方法,如果发现该对中的一个项与另一个项不同(因此丢弃任何返回值),则抛出异常.这里的要点不是该方法抛出异常,而是返回void.

换句话说,我们做ForEach了两个以上的收藏(顺便说一句,我知道Eric Lippert的想法ForEach,完全同意他并且从不使用它).

现在,Zip想要一个Func<TFirst, TSecond, TResult>,所以当然传递相当于的东西是Action<TFirst, TSecond>行不通的.

我的问题是:是否存在比这更好的惯用方法(即返回虚拟值)?

var collection1 = new List<int>() { ... };
var collection2 = new List<int>() { ... };

collection1.Zip(collection2, (first, second) => 
{
    VoidMethodThatThrows(first, second);
    return true;
});
Run Code Online (Sandbox Code Playgroud)

c# linq func

11
推荐指数
1
解决办法
2136
查看次数

Func <>与委托和lambda表达式之间的区别

在深化自己使用C#的更高级功能的同时,我遇到了一些代码,我并不知道它的区别.这是关于这两行:

Func<string, int> giveLength = (text => text.Length);
Run Code Online (Sandbox Code Playgroud)

Func<string, int> giveLength = delegate(string text) { return text.Length; };
Run Code Online (Sandbox Code Playgroud)

这可以以相同的方式使用:

Console.WriteLine(giveLength("A random string."));
Run Code Online (Sandbox Code Playgroud)

所以基本上......这两条线有什么区别?这些行是否编译为相同的CIL?

c# lambda delegates func

11
推荐指数
2
解决办法
2万
查看次数

Func委托不链接方法

让我们想象一下简单的委托调用:

void Main()
{
    Func<int, int, string> tfunc = null;
    tfunc += Add; // bind first method
    tfunc += Sub; // bind second method 

    Console.WriteLine(tfunc(2, 2));
}

private string Add(int a, int b)
{
    return "Add: " + (a + b).ToString();
}

private string Sub(int a, int b)
{
    return "Sub: " + (a - b).ToString();
}
Run Code Online (Sandbox Code Playgroud)

该计划的结果是:

Sub: 0
Run Code Online (Sandbox Code Playgroud)

那么,为什么没有调用Add方法呢?我期待调用Method Add,然后调用方法Sub.

c# delegates func

11
推荐指数
1
解决办法
2022
查看次数

具有可变参数的函数的委托

我有这种功能

void func(params object[] parameters) { 
    //Function Body
}
Run Code Online (Sandbox Code Playgroud)

它可以接受以下类型的参数

func(10, "hello", 30.0);
func(10,20);
Run Code Online (Sandbox Code Playgroud)

等等.

我想Action为上面的函数创建一个委托.可能吗?如果不是那么为什么?

c# delegates func

11
推荐指数
1
解决办法
1万
查看次数

字典与Func作为关键

我想知道这是否是字典关键词的理智选择?我想要做的是使用表达式作为字典中的键,如:

    var map3 = new Dictionary<Func<int, bool>, int>();
    map3.Add((x) => x % 2 == 0, 1);
    map3.Add((x) => x % 10 == 0, 2);
    // ...

    var key = map3.Keys.SingleOrDefault(f => f(2));
    // key = (x) => x % 2
    // map3[key] = 1
Run Code Online (Sandbox Code Playgroud)

这样做的想法比拥有大的if-else或switch语句更简洁.

这有意义吗?它会起作用吗?有更简单的方法吗?

c# dictionary func

10
推荐指数
2
解决办法
2022
查看次数

C# - 如何将内联方法Func <T>定义为参数?

我编写了一个简单的SessionItem管理类来处理所有那些讨厌的空检查,如果不存在则插入一个默认值.这是我的GetItem方法:

public static T GetItem<T>(string key, Func<T> defaultValue)
{
    if (HttpContext.Current.Session[key] == null)
    {
        HttpContext.Current.Session[key] = defaultValue.Invoke();
    }
    return (T)HttpContext.Current.Session[key];
}
Run Code Online (Sandbox Code Playgroud)

现在,我如何实际使用它,将Func <T>作为内联方法参数传递?

c# generics func inline-method

9
推荐指数
1
解决办法
2万
查看次数

使用带有ByRef参数的lambda表达式的Func(Of Tin,Tout)会产生不兼容的签名错误

为什么这样:

Private [Function] As Func(Of Double, String) = Function(ByRef z As Double) z.ToString
Run Code Online (Sandbox Code Playgroud)

给出以下错误:

嵌套函数没有与委托String)兼容的签名.

这个:

Private [Function] As Func(Of Double, String) = Function(ByVal z As Double) z.ToString
Run Code Online (Sandbox Code Playgroud)

才不是?(区别是ByRef/ByVal)

而且,我怎么能实现这样的事情呢?

.net vb.net lambda func byref

9
推荐指数
2
解决办法
4239
查看次数