根据我的理解,我解释Func委托的含义如下.请在需要时纠正它们.
Declaration : Func<int> dg ;
1.我可以将其解释为"指向返回整数的方法的委托吗?".
Declaration : Func<int,int> delg1=r=>2*r;
*2.我可以将其解释为"'r'是一个lambda表达式,它本身是一个整数类型的参数,被评估为'2*r'并返回一个int?.*
Comparison : Delegate and lambda expression
3.如果代表和lambdas都是函数poiinters,那里有什么不同?
Comparison : Are the following two declarations equal?
decl 1 : Func<int,int> fn=(r)=>45*r;
decl 2 : Expression<Func<int,int>> ex = (r) => r * 10;
Run Code Online (Sandbox Code Playgroud)
4.如果上述两种结构都用于同一目的,那么哪里有所不同?
为什么我不能拥有这个?我的意思是它会节省代表声明:
int X=delegate int(){...};
Run Code Online (Sandbox Code Playgroud)
我知道可以这样做:
delegate int IntDelegate();
...
IntDelegate del=delegate(){return 25;};
int X=del();
Run Code Online (Sandbox Code Playgroud) 以下代码片段在foreach循环上抛出InvalidCastException:
无法将类型为"System.Windows.Forms.StatusStrip"的对象强制转换为"System.Windows.Forms.GroupBox".
我只是不明白这是怎么可能的......然后我又是一个菜鸟所以它可能是愚蠢的东西.
private void doSlide(GroupBox MoveThis)
{
//location 12,27
var t = Task.Factory.StartNew(() =>
{
ExecuteSecure(() =>
{
foreach (GroupBox box in this.Controls)
{
if (box != MoveThis)
{
box.Left = (-1) * box.Width;
}
else
{
do
{
if (box.Left > 12)
box.Left--;
else
box.Left++;
}
while (box.Left != 12);
}
}
});
});
}
Run Code Online (Sandbox Code Playgroud)
这是Execute Secure的代码
private void ExecuteSecure(Action a)
{
if (InvokeRequired)
BeginInvoke(a);
else a();
}
Run Code Online (Sandbox Code Playgroud)
基本上我有一个固定大小的表单和表单上的几个组框,其中只有一个在任何给定点可见.当我们需要创建一个新的GroupBox时,我们调用DoSlide(GroupBox)并指定我们想要显示的组框.然后它应该将窗体上的每个GroupBox移动到位置(-Box.Width,27),除了指定的窗体(滑动(递增或递减box.left)到视图中).
如果我要翻译这个匿名方法:
Func<int, int> f = delegate(int i)
{
return i + 1;
};
Run Code Online (Sandbox Code Playgroud)
进入lambda表达式,它会这样:
Func<int, int> f = i => i + 1;
Run Code Online (Sandbox Code Playgroud)
(我知道:这个lambda表达式将秘密生成另一个匿名方法(由编译器),但这不是重点).
现在我想将以下方法转换为lambda表达式:
Func<int, int> f = delegate(int i)
{
Debug.WriteLine("Inside the function!");
return i + 1;
};
Run Code Online (Sandbox Code Playgroud)
有办法吗?我该怎么做?
我想格式化词组并根据项目数结尾。
string s = string.Format("There are {0} items, bla bla {1}",
itemsCnt,
() => {switch(itemsCnt)
{
case 0:
return "make some...";
case 1:
case 2:
return "try more";
default:
return "enough";
}}
);
Run Code Online (Sandbox Code Playgroud)
语法不正确,我相信匿名方法应该以某种方式在这里工作...
更新:
我可以使用单独的格式化功能。我想在Razor中使用该函数,并且希望将格式化逻辑放在一个地方。而且我很好奇如何做到这一点:-)
Lamb的左侧或作为运算符不允许使用Lambda.MSDN
一个真实的例子清楚的解释将不胜感激?
请参阅下面的第二位代码..代码无法编译.我试图找出anon方法,我明白了..
但不是不使用我在网上找到的匿名方法的例子,它不能编译
使用VS2008 ..编译到.NET3.5
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TestAnonymousMethods
{
public class Program
{
// using an anon method
static void Mainx(string[] args)
{
int[] _integers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int[] evenIntegers = Array.FindAll(_integers,
// this is the anonymous method below
delegate(int integer)
{
return (integer % 2 == 0);
}
);
foreach (int integer in _integers)
Console.WriteLine(integer);
foreach (int integer in evenIntegers)
Console.WriteLine(integer);
}
// …Run Code Online (Sandbox Code Playgroud) 可以在C#中完成以下操作吗?:
var greeting = "Hello" + function ()
{
return " World";
}() + "!";
Run Code Online (Sandbox Code Playgroud)
我想做一些事情(C#伪代码):
var cell = new TableCell { CssClass = "", Text = return delegate ()
{
return "logic goes here";
}};
Run Code Online (Sandbox Code Playgroud)
基本上我想实现某些逻辑的内联作用域,而不是将该块逻辑移动到单独的方法中.
我想在扩展方法的函数中修改局部变量.看到
int myvar=0;
MyList.Where(
x =>
{
if (condition)
myvar += 1;
return false;
});
return myvar;
Run Code Online (Sandbox Code Playgroud)
为什么那不起作用?
好的,在python中可以这样做:
def foo(monkeys):
def bar(monkey):
#process and return new monkey
processed_monkeys = list()
for monkey in monkeys:
processed_monkeys += bar(monkey)
return processed_monkeys
Run Code Online (Sandbox Code Playgroud)
(这只是一个愚蠢的例子)我有时会错过在c#中另一个方法中声明一个方法的功能.但今天我有以下想法来完成这个:
List<Monkey> foo(List<Monkey> monkeys)
{
Func<Monkey, Monkey> bar = delegate(Monkey monkey)
{
//process and return new monkey
}
List<Monkey> processed_monkeys = new List<Monkey>(monkeys.Count);
foreach(Monkey monkey in monkeys)
processed_monkeys.Append(bar(monkey));
return processed_monkeys;
}
Run Code Online (Sandbox Code Playgroud)
显然,变通方法不提供与原始功能完全相同的功能,因为Func或Action Delegates限制为4个参数,但很少需要4个以上的参数......
你对此有何看法?
这是邪恶的,应该避免除了非常特殊的情况吗?
这个表现如何?每次调用函数时都会创建一个新的bar函数,还是编译器会以某种方式优化它?
我有以下代码片段(作为示例)查找联系人:
public string Search()
{
string address = "";
ContactManager manager = new ContactManager();
// LookupComplete is just a plain event
manager.LookupComplete += delegate
{
address = manager.Address;
};
manager.SearchFor("bob");
return address; // Address always appears to be populated
}
Run Code Online (Sandbox Code Playgroud)
更新:
这是ContactManager:
public class ContactManager
{
public string Address {get;set;}
public event LookupComplete;
public void SearchFor(string query)
{
SomeParser parser = new Parser();
parser.TokenParsed += new EventHandler<TokenParseEventArgs>(tokenParsed);
parser.Parse(query);
}
private void tokenParsed(object sender,TokenParseEventArgs e)
{
if (e.Message == "EOF")
{ …Run Code Online (Sandbox Code Playgroud) 我有一个对象"ConnectableProperty"将一个属性连接到另一个属性,并要求我提供它Func.现在我有2种类型 - Scalar和Color.两者都可以通过显式运算符相互转换.出于某种原因,我不能喂Func<double, double, Scalar>到Func<double, double Color>,即使标量可以转换为彩色.这是怎么回事?
为了澄清,我添加了代码.请注意,可连接属性是"输入".输出(可以插入)是具有该签名的方法.
这是ConnectableProperty
public sealed class ConnectableProperty<T> : IEquatable<T>, IGetXY<T> where T : IValue<T>
{
private T _value;
public T Value { get { return _value; } set { _value = value; } }
public INode ParentNode { get; private set; }
public ValueConnection<T> Connection { get; set; }
public INode ConnectionFrom { get { return !IsConnected ? null : Connection.FromNode; } }
public bool IsConnected { get { return …Run Code Online (Sandbox Code Playgroud)